From a2a9b37e9be04105f7c512bd3129d44ebfccdb26 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Tue, 13 Sep 2022 11:11:45 -0400 Subject: [PATCH] chore: configure and deploy STT --- contracts/STT.sol | 698 ++++++++++++++ contracts/SntContract.sol | 1847 ------------------------------------- hardhat.config.ts | 17 +- package-lock.json | 1622 ++++++++++++++++++-------------- package.json | 2 +- scripts/deploy-stt.ts | 26 + 6 files changed, 1691 insertions(+), 2521 deletions(-) create mode 100644 contracts/STT.sol delete mode 100644 contracts/SntContract.sol create mode 100644 scripts/deploy-stt.ts diff --git a/contracts/STT.sol b/contracts/STT.sol new file mode 100644 index 0000000..801ec57 --- /dev/null +++ b/contracts/STT.sol @@ -0,0 +1,698 @@ +/** + *Submitted for verification at Etherscan.io on 2022-07-12 +*/ + +/** + *Submitted for verification at Etherscan.io on 2017-08-22 +*/ + +pragma solidity ^0.4.11; + +// Abstract contract for the full ERC 20 Token standard +// https://github.com/ethereum/EIPs/issues/20 + +contract ERC20Token { + /* This is a slight change to the ERC20 base standard. + function totalSupply() constant returns (uint256 supply); + is replaced with: + uint256 public totalSupply; + This automatically creates a getter function for the totalSupply. + This is moved to the base contract since public getter functions are not + currently recognised as an implementation of the matching abstract + function by the compiler. + */ + /// total amount of tokens + uint256 public totalSupply; + + /// @param _owner The address from which the balance will be retrieved + /// @return The balance + function balanceOf(address _owner) constant returns (uint256 balance); + + /// @notice send `_value` token to `_to` from `msg.sender` + /// @param _to The address of the recipient + /// @param _value The amount of token to be transferred + /// @return Whether the transfer was successful or not + function transfer(address _to, uint256 _value) returns (bool success); + + /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` + /// @param _from The address of the sender + /// @param _to The address of the recipient + /// @param _value The amount of token to be transferred + /// @return Whether the transfer was successful or not + function transferFrom(address _from, address _to, uint256 _value) returns (bool success); + + /// @notice `msg.sender` approves `_spender` to spend `_value` tokens + /// @param _spender The address of the account able to transfer the tokens + /// @param _value The amount of tokens to be approved for transfer + /// @return Whether the approval was successful or not + function approve(address _spender, uint256 _value) returns (bool success); + + /// @param _owner The address of the account owning tokens + /// @param _spender The address of the account able to transfer the tokens + /// @return Amount of remaining tokens allowed to spent + function allowance(address _owner, address _spender) constant returns (uint256 remaining); + + event Transfer(address indexed _from, address indexed _to, uint256 _value); + event Approval(address indexed _owner, address indexed _spender, uint256 _value); +} + + + + +/* + Copyright 2016, Jordi Baylina + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +/// @title MiniMeToken Contract +/// @author Jordi Baylina +/// @dev This token contract's goal is to make it easy for anyone to clone this +/// token using the token distribution at a given block, this will allow DAO's +/// and DApps to upgrade their features in a decentralized manner without +/// affecting the original token +/// @dev It is ERC20 compliant, but still needs to under go further testing. + + +/// @dev The token controller contract must implement these functions +contract TokenController { + /// @notice Called when `_owner` sends ether to the MiniMe Token contract + /// @param _owner The address that sent the ether to create tokens + /// @return True if the ether is accepted, false if it throws + function proxyPayment(address _owner) payable returns(bool); + + /// @notice Notifies the controller about a token transfer allowing the + /// controller to react if desired + /// @param _from The origin of the transfer + /// @param _to The destination of the transfer + /// @param _amount The amount of the transfer + /// @return False if the controller does not authorize the transfer + function onTransfer(address _from, address _to, uint _amount) returns(bool); + + /// @notice Notifies the controller about an approval allowing the + /// controller to react if desired + /// @param _owner The address that calls `approve()` + /// @param _spender The spender in the `approve()` call + /// @param _amount The amount in the `approve()` call + /// @return False if the controller does not authorize the approval + function onApprove(address _owner, address _spender, uint _amount) + returns(bool); +} + +contract Controlled { + /// @notice The address of the controller is the only address that can call + /// a function with this modifier + modifier onlyController { if (msg.sender != controller) throw; _; } + + address public controller; + + function Controlled() { controller = msg.sender;} + + /// @notice Changes the controller of the contract + /// @param _newController The new controller of the contract + function changeController(address _newController) onlyController { + controller = _newController; + } +} + +contract ApproveAndCallFallBack { + function receiveApproval(address from, uint256 _amount, address _token, bytes _data); +} + +/// @dev The actual token contract, the default controller is the msg.sender +/// that deploys the contract, so usually this token will be deployed by a +/// token controller contract, which Giveth will call a "Campaign" +contract MiniMeToken is Controlled { + + string public name; //The Token's name: e.g. DigixDAO Tokens + uint8 public decimals; //Number of decimals of the smallest unit + string public symbol; //An identifier: e.g. REP + string public version = 'MMT_0.1'; //An arbitrary versioning scheme + + + /// @dev `Checkpoint` is the structure that attaches a block number to a + /// given value, the block number attached is the one that last changed the + /// value + struct Checkpoint { + + // `fromBlock` is the block number that the value was generated from + uint128 fromBlock; + + // `value` is the amount of tokens at a specific block number + uint128 value; + } + + // `parentToken` is the Token address that was cloned to produce this token; + // it will be 0x0 for a token that was not cloned + MiniMeToken public parentToken; + + // `parentSnapShotBlock` is the block number from the Parent Token that was + // used to determine the initial distribution of the Clone Token + uint public parentSnapShotBlock; + + // `creationBlock` is the block number that the Clone Token was created + uint public creationBlock; + + // `balances` is the map that tracks the balance of each address, in this + // contract when the balance changes the block number that the change + // occurred is also included in the map + mapping (address => Checkpoint[]) balances; + + // `allowed` tracks any extra transfer rights as in all ERC20 tokens + mapping (address => mapping (address => uint256)) allowed; + + // Tracks the history of the `totalSupply` of the token + Checkpoint[] totalSupplyHistory; + + // Flag that determines if the token is transferable or not. + bool public transfersEnabled; + + // The factory used to create new clone tokens + MiniMeTokenFactory public tokenFactory; + +//////////////// +// Constructor +//////////////// + + /// @notice Constructor to create a MiniMeToken + /// @param _tokenFactory The address of the MiniMeTokenFactory contract that + /// will create the Clone token contracts, the token factory needs to be + /// deployed first + /// @param _parentToken Address of the parent token, set to 0x0 if it is a + /// new token + /// @param _parentSnapShotBlock Block of the parent token that will + /// determine the initial distribution of the clone token, set to 0 if it + /// is a new token + /// @param _tokenName Name of the new token + /// @param _decimalUnits Number of decimals of the new token + /// @param _tokenSymbol Token Symbol for the new token + /// @param _transfersEnabled If true, tokens will be able to be transferred + function MiniMeToken( + address _tokenFactory, + address _parentToken, + uint _parentSnapShotBlock, + string _tokenName, + uint8 _decimalUnits, + string _tokenSymbol, + bool _transfersEnabled + ) { + tokenFactory = MiniMeTokenFactory(_tokenFactory); + name = _tokenName; // Set the name + decimals = _decimalUnits; // Set the decimals + symbol = _tokenSymbol; // Set the symbol + parentToken = MiniMeToken(_parentToken); + parentSnapShotBlock = _parentSnapShotBlock; + transfersEnabled = _transfersEnabled; + creationBlock = getBlockNumber(); + } + + +/////////////////// +// ERC20 Methods +/////////////////// + + /// @notice Send `_amount` tokens to `_to` from `msg.sender` + /// @param _to The address of the recipient + /// @param _amount The amount of tokens to be transferred + /// @return Whether the transfer was successful or not + function transfer(address _to, uint256 _amount) returns (bool success) { + if (!transfersEnabled) throw; + return doTransfer(msg.sender, _to, _amount); + } + + /// @notice Send `_amount` tokens to `_to` from `_from` on the condition it + /// is approved by `_from` + /// @param _from The address holding the tokens being transferred + /// @param _to The address of the recipient + /// @param _amount The amount of tokens to be transferred + /// @return True if the transfer was successful + function transferFrom(address _from, address _to, uint256 _amount + ) returns (bool success) { + + // The controller of this contract can move tokens around at will, + // this is important to recognize! Confirm that you trust the + // controller of this contract, which in most situations should be + // another open source smart contract or 0x0 + if (msg.sender != controller) { + if (!transfersEnabled) throw; + + // The standard ERC 20 transferFrom functionality + if (allowed[_from][msg.sender] < _amount) return false; + allowed[_from][msg.sender] -= _amount; + } + return doTransfer(_from, _to, _amount); + } + + /// @dev This is the actual transfer function in the token contract, it can + /// only be called by other functions in this contract. + /// @param _from The address holding the tokens being transferred + /// @param _to The address of the recipient + /// @param _amount The amount of tokens to be transferred + /// @return True if the transfer was successful + function doTransfer(address _from, address _to, uint _amount + ) internal returns(bool) { + + if (_amount == 0) { + return true; + } + + if (parentSnapShotBlock >= getBlockNumber()) throw; + + // Do not allow transfer to 0x0 or the token contract itself + if ((_to == 0) || (_to == address(this))) throw; + + // If the amount being transfered is more than the balance of the + // account the transfer returns false + var previousBalanceFrom = balanceOfAt(_from, getBlockNumber()); + if (previousBalanceFrom < _amount) { + return false; + } + + // Alerts the token controller of the transfer + if (isContract(controller)) { + if (!TokenController(controller).onTransfer(_from, _to, _amount)) + throw; + } + + // First update the balance array with the new value for the address + // sending the tokens + updateValueAtNow(balances[_from], previousBalanceFrom - _amount); + + // Then update the balance array with the new value for the address + // receiving the tokens + var previousBalanceTo = balanceOfAt(_to, getBlockNumber()); + if (previousBalanceTo + _amount < previousBalanceTo) throw; // Check for overflow + updateValueAtNow(balances[_to], previousBalanceTo + _amount); + + // An event to make the transfer easy to find on the blockchain + Transfer(_from, _to, _amount); + + return true; + } + + /// @param _owner The address that's balance is being requested + /// @return The balance of `_owner` at the current block + function balanceOf(address _owner) constant returns (uint256 balance) { + return balanceOfAt(_owner, getBlockNumber()); + } + + /// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on + /// its behalf. This is a modified version of the ERC20 approve function + /// to be a little bit safer + /// @param _spender The address of the account able to transfer the tokens + /// @param _amount The amount of tokens to be approved for transfer + /// @return True if the approval was successful + function approve(address _spender, uint256 _amount) returns (bool success) { + if (!transfersEnabled) throw; + + // To change the approve amount you first have to reduce the addresses` + // allowance to zero by calling `approve(_spender,0)` if it is not + // already 0 to mitigate the race condition described here: + // https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + if ((_amount!=0) && (allowed[msg.sender][_spender] !=0)) throw; + + // Alerts the token controller of the approve function call + if (isContract(controller)) { + if (!TokenController(controller).onApprove(msg.sender, _spender, _amount)) + throw; + } + + allowed[msg.sender][_spender] = _amount; + Approval(msg.sender, _spender, _amount); + return true; + } + + /// @dev This function makes it easy to read the `allowed[]` map + /// @param _owner The address of the account that owns the token + /// @param _spender The address of the account able to transfer the tokens + /// @return Amount of remaining tokens of _owner that _spender is allowed + /// to spend + function allowance(address _owner, address _spender + ) constant returns (uint256 remaining) { + return allowed[_owner][_spender]; + } + + /// @notice `msg.sender` approves `_spender` to send `_amount` tokens on + /// its behalf, and then a function is triggered in the contract that is + /// being approved, `_spender`. This allows users to use their tokens to + /// interact with contracts in one function call instead of two + /// @param _spender The address of the contract able to transfer the tokens + /// @param _amount The amount of tokens to be approved for transfer + /// @return True if the function call was successful + function approveAndCall(address _spender, uint256 _amount, bytes _extraData + ) returns (bool success) { + if (!approve(_spender, _amount)) throw; + + ApproveAndCallFallBack(_spender).receiveApproval( + msg.sender, + _amount, + this, + _extraData + ); + + return true; + } + + /// @dev This function makes it easy to get the total number of tokens + /// @return The total number of tokens + function totalSupply() constant returns (uint) { + return totalSupplyAt(getBlockNumber()); + } + + +//////////////// +// Query balance and totalSupply in History +//////////////// + + /// @dev Queries the balance of `_owner` at a specific `_blockNumber` + /// @param _owner The address from which the balance will be retrieved + /// @param _blockNumber The block number when the balance is queried + /// @return The balance at `_blockNumber` + function balanceOfAt(address _owner, uint _blockNumber) constant + returns (uint) { + + // These next few lines are used when the balance of the token is + // requested before a check point was ever created for this token, it + // requires that the `parentToken.balanceOfAt` be queried at the + // genesis block for that token as this contains initial balance of + // this token + if ((balances[_owner].length == 0) + || (balances[_owner][0].fromBlock > _blockNumber)) { + if (address(parentToken) != 0) { + return parentToken.balanceOfAt(_owner, min(_blockNumber, parentSnapShotBlock)); + } else { + // Has no parent + return 0; + } + + // This will return the expected balance during normal situations + } else { + return getValueAt(balances[_owner], _blockNumber); + } + } + + /// @notice Total amount of tokens at a specific `_blockNumber`. + /// @param _blockNumber The block number when the totalSupply is queried + /// @return The total amount of tokens at `_blockNumber` + function totalSupplyAt(uint _blockNumber) constant returns(uint) { + + // These next few lines are used when the totalSupply of the token is + // requested before a check point was ever created for this token, it + // requires that the `parentToken.totalSupplyAt` be queried at the + // genesis block for this token as that contains totalSupply of this + // token at this block number. + if ((totalSupplyHistory.length == 0) + || (totalSupplyHistory[0].fromBlock > _blockNumber)) { + if (address(parentToken) != 0) { + return parentToken.totalSupplyAt(min(_blockNumber, parentSnapShotBlock)); + } else { + return 0; + } + + // This will return the expected totalSupply during normal situations + } else { + return getValueAt(totalSupplyHistory, _blockNumber); + } + } + +//////////////// +// Clone Token Method +//////////////// + + /// @notice Creates a new clone token with the initial distribution being + /// this token at `_snapshotBlock` + /// @param _cloneTokenName Name of the clone token + /// @param _cloneDecimalUnits Number of decimals of the smallest unit + /// @param _cloneTokenSymbol Symbol of the clone token + /// @param _snapshotBlock Block when the distribution of the parent token is + /// copied to set the initial distribution of the new clone token; + /// if the block is zero than the actual block, the current block is used + /// @param _transfersEnabled True if transfers are allowed in the clone + /// @return The address of the new MiniMeToken Contract + function createCloneToken( + string _cloneTokenName, + uint8 _cloneDecimalUnits, + string _cloneTokenSymbol, + uint _snapshotBlock, + bool _transfersEnabled + ) returns(address) { + if (_snapshotBlock == 0) _snapshotBlock = getBlockNumber(); + MiniMeToken cloneToken = tokenFactory.createCloneToken( + this, + _snapshotBlock, + _cloneTokenName, + _cloneDecimalUnits, + _cloneTokenSymbol, + _transfersEnabled + ); + + cloneToken.changeController(msg.sender); + + // An event to make the token easy to find on the blockchain + NewCloneToken(address(cloneToken), _snapshotBlock); + return address(cloneToken); + } + +//////////////// +// Generate and destroy tokens +//////////////// + + /// @notice Generates `_amount` tokens that are assigned to `_owner` + /// @param _owner The address that will be assigned the new tokens + /// @param _amount The quantity of tokens generated + /// @return True if the tokens are generated correctly + function generateTokens(address _owner, uint _amount + ) onlyController returns (bool) { + uint curTotalSupply = getValueAt(totalSupplyHistory, getBlockNumber()); + if (curTotalSupply + _amount < curTotalSupply) throw; // Check for overflow + updateValueAtNow(totalSupplyHistory, curTotalSupply + _amount); + var previousBalanceTo = balanceOf(_owner); + if (previousBalanceTo + _amount < previousBalanceTo) throw; // Check for overflow + updateValueAtNow(balances[_owner], previousBalanceTo + _amount); + Transfer(0, _owner, _amount); + return true; + } + + + /// @notice Burns `_amount` tokens from `_owner` + /// @param _owner The address that will lose the tokens + /// @param _amount The quantity of tokens to burn + /// @return True if the tokens are burned correctly + function destroyTokens(address _owner, uint _amount + ) onlyController returns (bool) { + uint curTotalSupply = getValueAt(totalSupplyHistory, getBlockNumber()); + if (curTotalSupply < _amount) throw; + updateValueAtNow(totalSupplyHistory, curTotalSupply - _amount); + var previousBalanceFrom = balanceOf(_owner); + if (previousBalanceFrom < _amount) throw; + updateValueAtNow(balances[_owner], previousBalanceFrom - _amount); + Transfer(_owner, 0, _amount); + return true; + } + +//////////////// +// Enable tokens transfers +//////////////// + + + /// @notice Enables token holders to transfer their tokens freely if true + /// @param _transfersEnabled True if transfers are allowed in the clone + function enableTransfers(bool _transfersEnabled) onlyController { + transfersEnabled = _transfersEnabled; + } + +//////////////// +// Internal helper functions to query and set a value in a snapshot array +//////////////// + + /// @dev `getValueAt` retrieves the number of tokens at a given block number + /// @param checkpoints The history of values being queried + /// @param _block The block number to retrieve the value at + /// @return The number of tokens being queried + function getValueAt(Checkpoint[] storage checkpoints, uint _block + ) constant internal returns (uint) { + if (checkpoints.length == 0) return 0; + + // Shortcut for the actual value + if (_block >= checkpoints[checkpoints.length-1].fromBlock) + return checkpoints[checkpoints.length-1].value; + if (_block < checkpoints[0].fromBlock) return 0; + + // Binary search of the value in the array + uint min = 0; + uint max = checkpoints.length-1; + while (max > min) { + uint mid = (max + min + 1)/ 2; + if (checkpoints[mid].fromBlock<=_block) { + min = mid; + } else { + max = mid-1; + } + } + return checkpoints[min].value; + } + + /// @dev `updateValueAtNow` used to update the `balances` map and the + /// `totalSupplyHistory` + /// @param checkpoints The history of data being updated + /// @param _value The new number of tokens + function updateValueAtNow(Checkpoint[] storage checkpoints, uint _value + ) internal { + if ((checkpoints.length == 0) + || (checkpoints[checkpoints.length -1].fromBlock < getBlockNumber())) { + Checkpoint newCheckPoint = checkpoints[ checkpoints.length++ ]; + newCheckPoint.fromBlock = uint128(getBlockNumber()); + newCheckPoint.value = uint128(_value); + } else { + Checkpoint oldCheckPoint = checkpoints[checkpoints.length-1]; + oldCheckPoint.value = uint128(_value); + } + } + + /// @dev Internal function to determine if an address is a contract + /// @param _addr The address being queried + /// @return True if `_addr` is a contract + function isContract(address _addr) constant internal returns(bool) { + uint size; + if (_addr == 0) return false; + assembly { + size := extcodesize(_addr) + } + return size>0; + } + + /// @dev Helper function to return a min betwen the two uints + function min(uint a, uint b) internal returns (uint) { + return a < b ? a : b; + } + + /// @notice The fallback function: If the contract's controller has not been + /// set to 0, then the `proxyPayment` method is called which relays the + /// ether and creates tokens as described in the token controller contract + function () payable { + if (isContract(controller)) { + if (! TokenController(controller).proxyPayment.value(msg.value)(msg.sender)) + throw; + } else { + throw; + } + } + + +////////// +// Testing specific methods +////////// + + /// @notice This function is overridden by the test Mocks. + function getBlockNumber() internal constant returns (uint256) { + return block.number; + } + +////////// +// Safety Methods +////////// + + /// @notice This method can be used by the controller to extract mistakenly + /// sent tokens to this contract. + /// @param _token The address of the token contract that you want to recover + /// set to 0 in case you want to extract ether. + function claimTokens(address _token) onlyController { + if (_token == 0x0) { + controller.transfer(this.balance); + return; + } + + ERC20Token token = ERC20Token(_token); + uint balance = token.balanceOf(this); + token.transfer(controller, balance); + ClaimedTokens(_token, controller, balance); + } + +//////////////// +// Events +//////////////// + + event ClaimedTokens(address indexed _token, address indexed _controller, uint _amount); + event Transfer(address indexed _from, address indexed _to, uint256 _amount); + event NewCloneToken(address indexed _cloneToken, uint _snapshotBlock); + event Approval( + address indexed _owner, + address indexed _spender, + uint256 _amount + ); + +} + + +//////////////// +// MiniMeTokenFactory +//////////////// + +/// @dev This contract is used to generate clone contracts from a contract. +/// In solidity this is the way to create a contract from a contract of the +/// same class +contract MiniMeTokenFactory { + + /// @notice Update the DApp by creating a new token with new functionalities + /// the msg.sender becomes the controller of this clone token + /// @param _parentToken Address of the token being cloned + /// @param _snapshotBlock Block of the parent token that will + /// determine the initial distribution of the clone token + /// @param _tokenName Name of the new token + /// @param _decimalUnits Number of decimals of the new token + /// @param _tokenSymbol Token Symbol for the new token + /// @param _transfersEnabled If true, tokens will be able to be transferred + /// @return The address of the new token contract + function createCloneToken( + address _parentToken, + uint _snapshotBlock, + string _tokenName, + uint8 _decimalUnits, + string _tokenSymbol, + bool _transfersEnabled + ) returns (MiniMeToken) { + MiniMeToken newToken = new MiniMeToken( + this, + _parentToken, + _snapshotBlock, + _tokenName, + _decimalUnits, + _tokenSymbol, + _transfersEnabled + ); + + newToken.changeController(msg.sender); + return newToken; + } +} + + +/* + Copyright 2017, Jarrad Hope (Status Research & Development GmbH) +*/ + + +contract STT is MiniMeToken { + // @dev SNT constructor just parametrizes the MiniMeIrrevocableVestedToken constructor + function STT(address _tokenFactory) + MiniMeToken( + _tokenFactory, + 0x0, // no parent token + 0, // no snapshot block number from parent + "Status Test Token", // Token name + 18, // Decimals + "STT", // Symbol + true // Enable transfers + ) {} +} \ No newline at end of file diff --git a/contracts/SntContract.sol b/contracts/SntContract.sol deleted file mode 100644 index 5f5515c..0000000 --- a/contracts/SntContract.sol +++ /dev/null @@ -1,1847 +0,0 @@ -// /** -// *Submitted for verification at Etherscan.io on 2017-06-19 -// */ - -// pragma solidity ^0.4.11; - - -// /// @dev `Owned` is a base level contract that assigns an `owner` that can be -// /// later changed -// contract Owned { - -// /// @dev `owner` is the only address that can call a function with this -// /// modifier -// modifier onlyOwner() { -// require(msg.sender == owner); -// _; -// } - -// address public owner; - -// /// @notice The Constructor assigns the message sender to be `owner` -// function Owned() { -// owner = msg.sender; -// } - -// address public newOwner; - -// /// @notice `owner` can step down and assign some other address to this role -// /// @param _newOwner The address of the new owner. 0x0 can be used to create -// /// an unowned neutral vault, however that cannot be undone -// function changeOwner(address _newOwner) onlyOwner { -// newOwner = _newOwner; -// } - - -// function acceptOwnership() { -// if (msg.sender == newOwner) { -// owner = newOwner; -// } -// } -// } - -// // Abstract contract for the full ERC 20 Token standard -// // https://github.com/ethereum/EIPs/issues/20 - -// contract ERC20Token { -// /* This is a slight change to the ERC20 base standard. -// function totalSupply() constant returns (uint256 supply); -// is replaced with: -// uint256 public totalSupply; -// This automatically creates a getter function for the totalSupply. -// This is moved to the base contract since public getter functions are not -// currently recognised as an implementation of the matching abstract -// function by the compiler. -// */ -// /// total amount of tokens -// uint256 public totalSupply; - -// /// @param _owner The address from which the balance will be retrieved -// /// @return The balance -// function balanceOf(address _owner) constant returns (uint256 balance); - -// /// @notice send `_value` token to `_to` from `msg.sender` -// /// @param _to The address of the recipient -// /// @param _value The amount of token to be transferred -// /// @return Whether the transfer was successful or not -// function transfer(address _to, uint256 _value) returns (bool success); - -// /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` -// /// @param _from The address of the sender -// /// @param _to The address of the recipient -// /// @param _value The amount of token to be transferred -// /// @return Whether the transfer was successful or not -// function transferFrom(address _from, address _to, uint256 _value) returns (bool success); - -// /// @notice `msg.sender` approves `_spender` to spend `_value` tokens -// /// @param _spender The address of the account able to transfer the tokens -// /// @param _value The amount of tokens to be approved for transfer -// /// @return Whether the approval was successful or not -// function approve(address _spender, uint256 _value) returns (bool success); - -// /// @param _owner The address of the account owning tokens -// /// @param _spender The address of the account able to transfer the tokens -// /// @return Amount of remaining tokens allowed to spent -// function allowance(address _owner, address _spender) constant returns (uint256 remaining); - -// event Transfer(address indexed _from, address indexed _to, uint256 _value); -// event Approval(address indexed _owner, address indexed _spender, uint256 _value); -// } - - - -// /** -// * Math operations with safety checks -// */ -// library SafeMath { -// function mul(uint a, uint b) internal returns (uint) { -// uint c = a * b; -// assert(a == 0 || c / a == b); -// return c; -// } - -// function div(uint a, uint b) internal returns (uint) { -// // assert(b > 0); // Solidity automatically throws when dividing by 0 -// uint c = a / b; -// // assert(a == b * c + a % b); // There is no case in which this doesn't hold -// return c; -// } - -// function sub(uint a, uint b) internal returns (uint) { -// assert(b <= a); -// return a - b; -// } - -// function add(uint a, uint b) internal returns (uint) { -// uint c = a + b; -// assert(c >= a); -// return c; -// } - -// function max64(uint64 a, uint64 b) internal constant returns (uint64) { -// return a >= b ? a : b; -// } - -// function min64(uint64 a, uint64 b) internal constant returns (uint64) { -// return a < b ? a : b; -// } - -// function max256(uint256 a, uint256 b) internal constant returns (uint256) { -// return a >= b ? a : b; -// } - -// function min256(uint256 a, uint256 b) internal constant returns (uint256) { -// return a < b ? a : b; -// } -// } - - -// /* -// Copyright 2017, Jordi Baylina - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// */ - -// /// @title DynamicCeiling Contract -// /// @author Jordi Baylina -// /// @dev This contract calculates the ceiling from a series of curves. -// /// These curves are committed first and revealed later. -// /// All the curves must be in increasing order and the last curve is marked -// /// as the last one. -// /// This contract allows to hide and reveal the ceiling at will of the owner. - - - -// contract DynamicCeiling is Owned { -// using SafeMath for uint256; - -// struct Curve { -// bytes32 hash; -// // Absolute limit for this curve -// uint256 limit; -// // The funds remaining to be collected are divided by `slopeFactor` smooth ceiling -// // with a long tail where big and small buyers can take part. -// uint256 slopeFactor; -// // This keeps the curve flat at this number, until funds to be collected is less than this -// uint256 collectMinimum; -// } - -// address public contribution; - -// Curve[] public curves; -// uint256 public currentIndex; -// uint256 public revealedCurves; -// bool public allRevealed; - -// /// @dev `contribution` is the only address that can call a function with this -// /// modifier -// modifier onlyContribution { -// require(msg.sender == contribution); -// _; -// } - -// function DynamicCeiling(address _owner, address _contribution) { -// owner = _owner; -// contribution = _contribution; -// } - -// /// @notice This should be called by the creator of the contract to commit -// /// all the curves. -// /// @param _curveHashes Array of hashes of each curve. Each hash is calculated -// /// by the `calculateHash` method. More hashes than actual curves can be -// /// committed in order to hide also the number of curves. -// /// The remaining hashes can be just random numbers. -// function setHiddenCurves(bytes32[] _curveHashes) public onlyOwner { -// require(curves.length == 0); - -// curves.length = _curveHashes.length; -// for (uint256 i = 0; i < _curveHashes.length; i = i.add(1)) { -// curves[i].hash = _curveHashes[i]; -// } -// } - - -// /// @notice Anybody can reveal the next curve if he knows it. -// /// @param _limit Ceiling cap. -// /// (must be greater or equal to the previous one). -// /// @param _last `true` if it's the last curve. -// /// @param _salt Random number used to commit the curve -// function revealCurve(uint256 _limit, uint256 _slopeFactor, uint256 _collectMinimum, -// bool _last, bytes32 _salt) public { -// require(!allRevealed); - -// require(curves[revealedCurves].hash == calculateHash(_limit, _slopeFactor, _collectMinimum, -// _last, _salt)); - -// require(_limit != 0 && _slopeFactor != 0 && _collectMinimum != 0); -// if (revealedCurves > 0) { -// require(_limit >= curves[revealedCurves.sub(1)].limit); -// } - -// curves[revealedCurves].limit = _limit; -// curves[revealedCurves].slopeFactor = _slopeFactor; -// curves[revealedCurves].collectMinimum = _collectMinimum; -// revealedCurves = revealedCurves.add(1); - -// if (_last) allRevealed = true; -// } - -// /// @notice Reveal multiple curves at once -// function revealMulti(uint256[] _limits, uint256[] _slopeFactors, uint256[] _collectMinimums, -// bool[] _lasts, bytes32[] _salts) public { -// // Do not allow none and needs to be same length for all parameters -// require(_limits.length != 0 && -// _limits.length == _slopeFactors.length && -// _limits.length == _collectMinimums.length && -// _limits.length == _lasts.length && -// _limits.length == _salts.length); - -// for (uint256 i = 0; i < _limits.length; i = i.add(1)) { -// revealCurve(_limits[i], _slopeFactors[i], _collectMinimums[i], -// _lasts[i], _salts[i]); -// } -// } - -// /// @notice Move to curve, used as a failsafe -// function moveTo(uint256 _index) public onlyOwner { -// require(_index < revealedCurves && // No more curves -// _index == currentIndex.add(1)); // Only move one index at a time -// currentIndex = _index; -// } - -// /// @return Return the funds to collect for the current point on the curve -// /// (or 0 if no curves revealed yet) -// function toCollect(uint256 collected) public onlyContribution returns (uint256) { -// if (revealedCurves == 0) return 0; - -// // Move to the next curve -// if (collected >= curves[currentIndex].limit) { // Catches `limit == 0` -// uint256 nextIndex = currentIndex.add(1); -// if (nextIndex >= revealedCurves) return 0; // No more curves -// currentIndex = nextIndex; -// if (collected >= curves[currentIndex].limit) return 0; // Catches `limit == 0` -// } - -// // Everything left to collect from this limit -// uint256 difference = curves[currentIndex].limit.sub(collected); - -// // Current point on the curve -// uint256 collect = difference.div(curves[currentIndex].slopeFactor); - -// // Prevents paying too much fees vs to be collected; breaks long tail -// if (collect <= curves[currentIndex].collectMinimum) { -// if (difference > curves[currentIndex].collectMinimum) { -// return curves[currentIndex].collectMinimum; -// } else { -// return difference; -// } -// } else { -// return collect; -// } -// } - -// /// @notice Calculates the hash of a curve. -// /// @param _limit Ceiling cap. -// /// @param _last `true` if it's the last curve. -// /// @param _salt Random number that will be needed to reveal this curve. -// /// @return The calculated hash of this curve to be used in the `setHiddenCurves` method -// function calculateHash(uint256 _limit, uint256 _slopeFactor, uint256 _collectMinimum, -// bool _last, bytes32 _salt) public constant returns (bytes32) { -// return keccak256(_limit, _slopeFactor, _collectMinimum, _last, _salt); -// } - -// /// @return Return the total number of curves committed -// /// (can be larger than the number of actual curves on the curve to hide -// /// the real number of curves) -// function nCurves() public constant returns (uint256) { -// return curves.length; -// } - -// } - - -// /* -// Copyright 2016, Jordi Baylina - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// */ - -// /// @title MiniMeToken Contract -// /// @author Jordi Baylina -// /// @dev This token contract's goal is to make it easy for anyone to clone this -// /// token using the token distribution at a given block, this will allow DAO's -// /// and DApps to upgrade their features in a decentralized manner without -// /// affecting the original token -// /// @dev It is ERC20 compliant, but still needs to under go further testing. - - -// /// @dev The token controller contract must implement these functions -// contract TokenController { -// /// @notice Called when `_owner` sends ether to the MiniMe Token contract -// /// @param _owner The address that sent the ether to create tokens -// /// @return True if the ether is accepted, false if it throws -// function proxyPayment(address _owner) payable returns(bool); - -// /// @notice Notifies the controller about a token transfer allowing the -// /// controller to react if desired -// /// @param _from The origin of the transfer -// /// @param _to The destination of the transfer -// /// @param _amount The amount of the transfer -// /// @return False if the controller does not authorize the transfer -// function onTransfer(address _from, address _to, uint _amount) returns(bool); - -// /// @notice Notifies the controller about an approval allowing the -// /// controller to react if desired -// /// @param _owner The address that calls `approve()` -// /// @param _spender The spender in the `approve()` call -// /// @param _amount The amount in the `approve()` call -// /// @return False if the controller does not authorize the approval -// function onApprove(address _owner, address _spender, uint _amount) -// returns(bool); -// } - -// contract Controlled { -// /// @notice The address of the controller is the only address that can call -// /// a function with this modifier -// modifier onlyController { if (msg.sender != controller) throw; _; } - -// address public controller; - -// function Controlled() { controller = msg.sender;} - -// /// @notice Changes the controller of the contract -// /// @param _newController The new controller of the contract -// function changeController(address _newController) onlyController { -// controller = _newController; -// } -// } - -// contract ApproveAndCallFallBack { -// function receiveApproval(address from, uint256 _amount, address _token, bytes _data); -// } - -// /// @dev The actual token contract, the default controller is the msg.sender -// /// that deploys the contract, so usually this token will be deployed by a -// /// token controller contract, which Giveth will call a "Campaign" -// contract MiniMeToken is Controlled { - -// string public name; //The Token's name: e.g. DigixDAO Tokens -// uint8 public decimals; //Number of decimals of the smallest unit -// string public symbol; //An identifier: e.g. REP -// string public version = 'MMT_0.1'; //An arbitrary versioning scheme - - -// /// @dev `Checkpoint` is the structure that attaches a block number to a -// /// given value, the block number attached is the one that last changed the -// /// value -// struct Checkpoint { - -// // `fromBlock` is the block number that the value was generated from -// uint128 fromBlock; - -// // `value` is the amount of tokens at a specific block number -// uint128 value; -// } - -// // `parentToken` is the Token address that was cloned to produce this token; -// // it will be 0x0 for a token that was not cloned -// MiniMeToken public parentToken; - -// // `parentSnapShotBlock` is the block number from the Parent Token that was -// // used to determine the initial distribution of the Clone Token -// uint public parentSnapShotBlock; - -// // `creationBlock` is the block number that the Clone Token was created -// uint public creationBlock; - -// // `balances` is the map that tracks the balance of each address, in this -// // contract when the balance changes the block number that the change -// // occurred is also included in the map -// mapping (address => Checkpoint[]) balances; - -// // `allowed` tracks any extra transfer rights as in all ERC20 tokens -// mapping (address => mapping (address => uint256)) allowed; - -// // Tracks the history of the `totalSupply` of the token -// Checkpoint[] totalSupplyHistory; - -// // Flag that determines if the token is transferable or not. -// bool public transfersEnabled; - -// // The factory used to create new clone tokens -// MiniMeTokenFactory public tokenFactory; - -// //////////////// -// // Constructor -// //////////////// - -// /// @notice Constructor to create a MiniMeToken -// /// @param _tokenFactory The address of the MiniMeTokenFactory contract that -// /// will create the Clone token contracts, the token factory needs to be -// /// deployed first -// /// @param _parentToken Address of the parent token, set to 0x0 if it is a -// /// new token -// /// @param _parentSnapShotBlock Block of the parent token that will -// /// determine the initial distribution of the clone token, set to 0 if it -// /// is a new token -// /// @param _tokenName Name of the new token -// /// @param _decimalUnits Number of decimals of the new token -// /// @param _tokenSymbol Token Symbol for the new token -// /// @param _transfersEnabled If true, tokens will be able to be transferred -// function MiniMeToken( -// address _tokenFactory, -// address _parentToken, -// uint _parentSnapShotBlock, -// string _tokenName, -// uint8 _decimalUnits, -// string _tokenSymbol, -// bool _transfersEnabled -// ) { -// tokenFactory = MiniMeTokenFactory(_tokenFactory); -// name = _tokenName; // Set the name -// decimals = _decimalUnits; // Set the decimals -// symbol = _tokenSymbol; // Set the symbol -// parentToken = MiniMeToken(_parentToken); -// parentSnapShotBlock = _parentSnapShotBlock; -// transfersEnabled = _transfersEnabled; -// creationBlock = getBlockNumber(); -// } - - -// /////////////////// -// // ERC20 Methods -// /////////////////// - -// /// @notice Send `_amount` tokens to `_to` from `msg.sender` -// /// @param _to The address of the recipient -// /// @param _amount The amount of tokens to be transferred -// /// @return Whether the transfer was successful or not -// function transfer(address _to, uint256 _amount) returns (bool success) { -// if (!transfersEnabled) throw; -// return doTransfer(msg.sender, _to, _amount); -// } - -// /// @notice Send `_amount` tokens to `_to` from `_from` on the condition it -// /// is approved by `_from` -// /// @param _from The address holding the tokens being transferred -// /// @param _to The address of the recipient -// /// @param _amount The amount of tokens to be transferred -// /// @return True if the transfer was successful -// function transferFrom(address _from, address _to, uint256 _amount -// ) returns (bool success) { - -// // The controller of this contract can move tokens around at will, -// // this is important to recognize! Confirm that you trust the -// // controller of this contract, which in most situations should be -// // another open source smart contract or 0x0 -// if (msg.sender != controller) { -// if (!transfersEnabled) throw; - -// // The standard ERC 20 transferFrom functionality -// if (allowed[_from][msg.sender] < _amount) return false; -// allowed[_from][msg.sender] -= _amount; -// } -// return doTransfer(_from, _to, _amount); -// } - -// /// @dev This is the actual transfer function in the token contract, it can -// /// only be called by other functions in this contract. -// /// @param _from The address holding the tokens being transferred -// /// @param _to The address of the recipient -// /// @param _amount The amount of tokens to be transferred -// /// @return True if the transfer was successful -// function doTransfer(address _from, address _to, uint _amount -// ) internal returns(bool) { - -// if (_amount == 0) { -// return true; -// } - -// if (parentSnapShotBlock >= getBlockNumber()) throw; - -// // Do not allow transfer to 0x0 or the token contract itself -// if ((_to == 0) || (_to == address(this))) throw; - -// // If the amount being transfered is more than the balance of the -// // account the transfer returns false -// var previousBalanceFrom = balanceOfAt(_from, getBlockNumber()); -// if (previousBalanceFrom < _amount) { -// return false; -// } - -// // Alerts the token controller of the transfer -// if (isContract(controller)) { -// if (!TokenController(controller).onTransfer(_from, _to, _amount)) -// throw; -// } - -// // First update the balance array with the new value for the address -// // sending the tokens -// updateValueAtNow(balances[_from], previousBalanceFrom - _amount); - -// // Then update the balance array with the new value for the address -// // receiving the tokens -// var previousBalanceTo = balanceOfAt(_to, getBlockNumber()); -// if (previousBalanceTo + _amount < previousBalanceTo) throw; // Check for overflow -// updateValueAtNow(balances[_to], previousBalanceTo + _amount); - -// // An event to make the transfer easy to find on the blockchain -// Transfer(_from, _to, _amount); - -// return true; -// } - -// /// @param _owner The address that's balance is being requested -// /// @return The balance of `_owner` at the current block -// function balanceOf(address _owner) constant returns (uint256 balance) { -// return balanceOfAt(_owner, getBlockNumber()); -// } - -// /// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on -// /// its behalf. This is a modified version of the ERC20 approve function -// /// to be a little bit safer -// /// @param _spender The address of the account able to transfer the tokens -// /// @param _amount The amount of tokens to be approved for transfer -// /// @return True if the approval was successful -// function approve(address _spender, uint256 _amount) returns (bool success) { -// if (!transfersEnabled) throw; - -// // To change the approve amount you first have to reduce the addresses` -// // allowance to zero by calling `approve(_spender,0)` if it is not -// // already 0 to mitigate the race condition described here: -// // https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 -// if ((_amount!=0) && (allowed[msg.sender][_spender] !=0)) throw; - -// // Alerts the token controller of the approve function call -// if (isContract(controller)) { -// if (!TokenController(controller).onApprove(msg.sender, _spender, _amount)) -// throw; -// } - -// allowed[msg.sender][_spender] = _amount; -// Approval(msg.sender, _spender, _amount); -// return true; -// } - -// /// @dev This function makes it easy to read the `allowed[]` map -// /// @param _owner The address of the account that owns the token -// /// @param _spender The address of the account able to transfer the tokens -// /// @return Amount of remaining tokens of _owner that _spender is allowed -// /// to spend -// function allowance(address _owner, address _spender -// ) constant returns (uint256 remaining) { -// return allowed[_owner][_spender]; -// } - -// /// @notice `msg.sender` approves `_spender` to send `_amount` tokens on -// /// its behalf, and then a function is triggered in the contract that is -// /// being approved, `_spender`. This allows users to use their tokens to -// /// interact with contracts in one function call instead of two -// /// @param _spender The address of the contract able to transfer the tokens -// /// @param _amount The amount of tokens to be approved for transfer -// /// @return True if the function call was successful -// function approveAndCall(address _spender, uint256 _amount, bytes _extraData -// ) returns (bool success) { -// if (!approve(_spender, _amount)) throw; - -// ApproveAndCallFallBack(_spender).receiveApproval( -// msg.sender, -// _amount, -// this, -// _extraData -// ); - -// return true; -// } - -// /// @dev This function makes it easy to get the total number of tokens -// /// @return The total number of tokens -// function totalSupply() constant returns (uint) { -// return totalSupplyAt(getBlockNumber()); -// } - - -// //////////////// -// // Query balance and totalSupply in History -// //////////////// - -// /// @dev Queries the balance of `_owner` at a specific `_blockNumber` -// /// @param _owner The address from which the balance will be retrieved -// /// @param _blockNumber The block number when the balance is queried -// /// @return The balance at `_blockNumber` -// function balanceOfAt(address _owner, uint _blockNumber) constant -// returns (uint) { - -// // These next few lines are used when the balance of the token is -// // requested before a check point was ever created for this token, it -// // requires that the `parentToken.balanceOfAt` be queried at the -// // genesis block for that token as this contains initial balance of -// // this token -// if ((balances[_owner].length == 0) -// || (balances[_owner][0].fromBlock > _blockNumber)) { -// if (address(parentToken) != 0) { -// return parentToken.balanceOfAt(_owner, min(_blockNumber, parentSnapShotBlock)); -// } else { -// // Has no parent -// return 0; -// } - -// // This will return the expected balance during normal situations -// } else { -// return getValueAt(balances[_owner], _blockNumber); -// } -// } - -// /// @notice Total amount of tokens at a specific `_blockNumber`. -// /// @param _blockNumber The block number when the totalSupply is queried -// /// @return The total amount of tokens at `_blockNumber` -// function totalSupplyAt(uint _blockNumber) constant returns(uint) { - -// // These next few lines are used when the totalSupply of the token is -// // requested before a check point was ever created for this token, it -// // requires that the `parentToken.totalSupplyAt` be queried at the -// // genesis block for this token as that contains totalSupply of this -// // token at this block number. -// if ((totalSupplyHistory.length == 0) -// || (totalSupplyHistory[0].fromBlock > _blockNumber)) { -// if (address(parentToken) != 0) { -// return parentToken.totalSupplyAt(min(_blockNumber, parentSnapShotBlock)); -// } else { -// return 0; -// } - -// // This will return the expected totalSupply during normal situations -// } else { -// return getValueAt(totalSupplyHistory, _blockNumber); -// } -// } - -// //////////////// -// // Clone Token Method -// //////////////// - -// /// @notice Creates a new clone token with the initial distribution being -// /// this token at `_snapshotBlock` -// /// @param _cloneTokenName Name of the clone token -// /// @param _cloneDecimalUnits Number of decimals of the smallest unit -// /// @param _cloneTokenSymbol Symbol of the clone token -// /// @param _snapshotBlock Block when the distribution of the parent token is -// /// copied to set the initial distribution of the new clone token; -// /// if the block is zero than the actual block, the current block is used -// /// @param _transfersEnabled True if transfers are allowed in the clone -// /// @return The address of the new MiniMeToken Contract -// function createCloneToken( -// string _cloneTokenName, -// uint8 _cloneDecimalUnits, -// string _cloneTokenSymbol, -// uint _snapshotBlock, -// bool _transfersEnabled -// ) returns(address) { -// if (_snapshotBlock == 0) _snapshotBlock = getBlockNumber(); -// MiniMeToken cloneToken = tokenFactory.createCloneToken( -// this, -// _snapshotBlock, -// _cloneTokenName, -// _cloneDecimalUnits, -// _cloneTokenSymbol, -// _transfersEnabled -// ); - -// cloneToken.changeController(msg.sender); - -// // An event to make the token easy to find on the blockchain -// NewCloneToken(address(cloneToken), _snapshotBlock); -// return address(cloneToken); -// } - -// //////////////// -// // Generate and destroy tokens -// //////////////// - -// /// @notice Generates `_amount` tokens that are assigned to `_owner` -// /// @param _owner The address that will be assigned the new tokens -// /// @param _amount The quantity of tokens generated -// /// @return True if the tokens are generated correctly -// function generateTokens(address _owner, uint _amount -// ) onlyController returns (bool) { -// uint curTotalSupply = getValueAt(totalSupplyHistory, getBlockNumber()); -// if (curTotalSupply + _amount < curTotalSupply) throw; // Check for overflow -// updateValueAtNow(totalSupplyHistory, curTotalSupply + _amount); -// var previousBalanceTo = balanceOf(_owner); -// if (previousBalanceTo + _amount < previousBalanceTo) throw; // Check for overflow -// updateValueAtNow(balances[_owner], previousBalanceTo + _amount); -// Transfer(0, _owner, _amount); -// return true; -// } - - -// /// @notice Burns `_amount` tokens from `_owner` -// /// @param _owner The address that will lose the tokens -// /// @param _amount The quantity of tokens to burn -// /// @return True if the tokens are burned correctly -// function destroyTokens(address _owner, uint _amount -// ) onlyController returns (bool) { -// uint curTotalSupply = getValueAt(totalSupplyHistory, getBlockNumber()); -// if (curTotalSupply < _amount) throw; -// updateValueAtNow(totalSupplyHistory, curTotalSupply - _amount); -// var previousBalanceFrom = balanceOf(_owner); -// if (previousBalanceFrom < _amount) throw; -// updateValueAtNow(balances[_owner], previousBalanceFrom - _amount); -// Transfer(_owner, 0, _amount); -// return true; -// } - -// //////////////// -// // Enable tokens transfers -// //////////////// - - -// /// @notice Enables token holders to transfer their tokens freely if true -// /// @param _transfersEnabled True if transfers are allowed in the clone -// function enableTransfers(bool _transfersEnabled) onlyController { -// transfersEnabled = _transfersEnabled; -// } - -// //////////////// -// // Internal helper functions to query and set a value in a snapshot array -// //////////////// - -// /// @dev `getValueAt` retrieves the number of tokens at a given block number -// /// @param checkpoints The history of values being queried -// /// @param _block The block number to retrieve the value at -// /// @return The number of tokens being queried -// function getValueAt(Checkpoint[] storage checkpoints, uint _block -// ) constant internal returns (uint) { -// if (checkpoints.length == 0) return 0; - -// // Shortcut for the actual value -// if (_block >= checkpoints[checkpoints.length-1].fromBlock) -// return checkpoints[checkpoints.length-1].value; -// if (_block < checkpoints[0].fromBlock) return 0; - -// // Binary search of the value in the array -// uint min = 0; -// uint max = checkpoints.length-1; -// while (max > min) { -// uint mid = (max + min + 1)/ 2; -// if (checkpoints[mid].fromBlock<=_block) { -// min = mid; -// } else { -// max = mid-1; -// } -// } -// return checkpoints[min].value; -// } - -// /// @dev `updateValueAtNow` used to update the `balances` map and the -// /// `totalSupplyHistory` -// /// @param checkpoints The history of data being updated -// /// @param _value The new number of tokens -// function updateValueAtNow(Checkpoint[] storage checkpoints, uint _value -// ) internal { -// if ((checkpoints.length == 0) -// || (checkpoints[checkpoints.length -1].fromBlock < getBlockNumber())) { -// Checkpoint newCheckPoint = checkpoints[ checkpoints.length++ ]; -// newCheckPoint.fromBlock = uint128(getBlockNumber()); -// newCheckPoint.value = uint128(_value); -// } else { -// Checkpoint oldCheckPoint = checkpoints[checkpoints.length-1]; -// oldCheckPoint.value = uint128(_value); -// } -// } - -// /// @dev Internal function to determine if an address is a contract -// /// @param _addr The address being queried -// /// @return True if `_addr` is a contract -// function isContract(address _addr) constant internal returns(bool) { -// uint size; -// if (_addr == 0) return false; -// assembly { -// size := extcodesize(_addr) -// } -// return size>0; -// } - -// /// @dev Helper function to return a min betwen the two uints -// function min(uint a, uint b) internal returns (uint) { -// return a < b ? a : b; -// } - -// /// @notice The fallback function: If the contract's controller has not been -// /// set to 0, then the `proxyPayment` method is called which relays the -// /// ether and creates tokens as described in the token controller contract -// function () payable { -// if (isContract(controller)) { -// if (! TokenController(controller).proxyPayment.value(msg.value)(msg.sender)) -// throw; -// } else { -// throw; -// } -// } - - -// ////////// -// // Testing specific methods -// ////////// - -// /// @notice This function is overridden by the test Mocks. -// function getBlockNumber() internal constant returns (uint256) { -// return block.number; -// } - -// ////////// -// // Safety Methods -// ////////// - -// /// @notice This method can be used by the controller to extract mistakenly -// /// sent tokens to this contract. -// /// @param _token The address of the token contract that you want to recover -// /// set to 0 in case you want to extract ether. -// function claimTokens(address _token) onlyController { -// if (_token == 0x0) { -// controller.transfer(this.balance); -// return; -// } - -// ERC20Token token = ERC20Token(_token); -// uint balance = token.balanceOf(this); -// token.transfer(controller, balance); -// ClaimedTokens(_token, controller, balance); -// } - -// //////////////// -// // Events -// //////////////// - -// event ClaimedTokens(address indexed _token, address indexed _controller, uint _amount); -// event Transfer(address indexed _from, address indexed _to, uint256 _amount); -// event NewCloneToken(address indexed _cloneToken, uint _snapshotBlock); -// event Approval( -// address indexed _owner, -// address indexed _spender, -// uint256 _amount -// ); - -// } - - -// //////////////// -// // MiniMeTokenFactory -// //////////////// - -// /// @dev This contract is used to generate clone contracts from a contract. -// /// In solidity this is the way to create a contract from a contract of the -// /// same class -// contract MiniMeTokenFactory { - -// /// @notice Update the DApp by creating a new token with new functionalities -// /// the msg.sender becomes the controller of this clone token -// /// @param _parentToken Address of the token being cloned -// /// @param _snapshotBlock Block of the parent token that will -// /// determine the initial distribution of the clone token -// /// @param _tokenName Name of the new token -// /// @param _decimalUnits Number of decimals of the new token -// /// @param _tokenSymbol Token Symbol for the new token -// /// @param _transfersEnabled If true, tokens will be able to be transferred -// /// @return The address of the new token contract -// function createCloneToken( -// address _parentToken, -// uint _snapshotBlock, -// string _tokenName, -// uint8 _decimalUnits, -// string _tokenSymbol, -// bool _transfersEnabled -// ) returns (MiniMeToken) { -// MiniMeToken newToken = new MiniMeToken( -// this, -// _parentToken, -// _snapshotBlock, -// _tokenName, -// _decimalUnits, -// _tokenSymbol, -// _transfersEnabled -// ); - -// newToken.changeController(msg.sender); -// return newToken; -// } -// } - - -// /* -// Copyright 2017, Jarrad Hope (Status Research & Development GmbH) -// */ - - -// contract SNT is MiniMeToken { -// // @dev SNT constructor just parametrizes the MiniMeIrrevocableVestedToken constructor -// function SNT(address _tokenFactory) -// MiniMeToken( -// _tokenFactory, -// 0x0, // no parent token -// 0, // no snapshot block number from parent -// "Status Network Token", // Token name -// 18, // Decimals -// "SNT", // Symbol -// true // Enable transfers -// ) {} -// } - - -// /* -// Copyright 2017, Jordi Baylina - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// */ - -// /// @title StatusContribution Contract -// /// @author Jordi Baylina -// /// @dev This contract will be the SNT controller during the contribution period. -// /// This contract will determine the rules during this period. -// /// Final users will generally not interact directly with this contract. ETH will -// /// be sent to the SNT token contract. The ETH is sent to this contract and from here, -// /// ETH is sent to the contribution walled and SNTs are mined according to the defined -// /// rules. - - -// contract StatusContribution is Owned, TokenController { -// using SafeMath for uint256; - -// uint256 constant public failSafeLimit = 300000 ether; -// uint256 constant public maxGuaranteedLimit = 30000 ether; -// uint256 constant public exchangeRate = 10000; -// uint256 constant public maxGasPrice = 50000000000; -// uint256 constant public maxCallFrequency = 100; - -// MiniMeToken public SGT; -// MiniMeToken public SNT; -// uint256 public startBlock; -// uint256 public endBlock; - -// address public destEthDevs; - -// address public destTokensDevs; -// address public destTokensReserve; -// uint256 public maxSGTSupply; -// address public destTokensSgt; -// DynamicCeiling public dynamicCeiling; - -// address public sntController; - -// mapping (address => uint256) public guaranteedBuyersLimit; -// mapping (address => uint256) public guaranteedBuyersBought; - -// uint256 public totalGuaranteedCollected; -// uint256 public totalNormalCollected; - -// uint256 public finalizedBlock; -// uint256 public finalizedTime; - -// mapping (address => uint256) public lastCallBlock; - -// bool public paused; - -// modifier initialized() { -// require(address(SNT) != 0x0); -// _; -// } - -// modifier contributionOpen() { -// require(getBlockNumber() >= startBlock && -// getBlockNumber() <= endBlock && -// finalizedBlock == 0 && -// address(SNT) != 0x0); -// _; -// } - -// modifier notPaused() { -// require(!paused); -// _; -// } - -// function StatusContribution() { -// paused = false; -// } - - -// /// @notice This method should be called by the owner before the contribution -// /// period starts This initializes most of the parameters -// /// @param _snt Address of the SNT token contract -// /// @param _sntController Token controller for the SNT that will be transferred after -// /// the contribution finalizes. -// /// @param _startBlock Block when the contribution period starts -// /// @param _endBlock The last block that the contribution period is active -// /// @param _dynamicCeiling Address of the contract that controls the ceiling -// /// @param _destEthDevs Destination address where the contribution ether is sent -// /// @param _destTokensReserve Address where the tokens for the reserve are sent -// /// @param _destTokensSgt Address of the exchanger SGT-SNT where the SNT are sent -// /// to be distributed to the SGT holders. -// /// @param _destTokensDevs Address where the tokens for the dev are sent -// /// @param _sgt Address of the SGT token contract -// /// @param _maxSGTSupply Quantity of SGT tokens that would represent 10% of status. -// function initialize( -// address _snt, -// address _sntController, - -// uint256 _startBlock, -// uint256 _endBlock, - -// address _dynamicCeiling, - -// address _destEthDevs, - -// address _destTokensReserve, -// address _destTokensSgt, -// address _destTokensDevs, - -// address _sgt, -// uint256 _maxSGTSupply -// ) public onlyOwner { -// // Initialize only once -// require(address(SNT) == 0x0); - -// SNT = MiniMeToken(_snt); -// require(SNT.totalSupply() == 0); -// require(SNT.controller() == address(this)); -// require(SNT.decimals() == 18); // Same amount of decimals as ETH - -// require(_sntController != 0x0); -// sntController = _sntController; - -// require(_startBlock >= getBlockNumber()); -// require(_startBlock < _endBlock); -// startBlock = _startBlock; -// endBlock = _endBlock; - -// require(_dynamicCeiling != 0x0); -// dynamicCeiling = DynamicCeiling(_dynamicCeiling); - -// require(_destEthDevs != 0x0); -// destEthDevs = _destEthDevs; - -// require(_destTokensReserve != 0x0); -// destTokensReserve = _destTokensReserve; - -// require(_destTokensSgt != 0x0); -// destTokensSgt = _destTokensSgt; - -// require(_destTokensDevs != 0x0); -// destTokensDevs = _destTokensDevs; - -// require(_sgt != 0x0); -// SGT = MiniMeToken(_sgt); - -// require(_maxSGTSupply >= MiniMeToken(SGT).totalSupply()); -// maxSGTSupply = _maxSGTSupply; -// } - -// /// @notice Sets the limit for a guaranteed address. All the guaranteed addresses -// /// will be able to get SNTs during the contribution period with his own -// /// specific limit. -// /// This method should be called by the owner after the initialization -// /// and before the contribution starts. -// /// @param _th Guaranteed address -// /// @param _limit Limit for the guaranteed address. -// function setGuaranteedAddress(address _th, uint256 _limit) public initialized onlyOwner { -// require(getBlockNumber() < startBlock); -// require(_limit > 0 && _limit <= maxGuaranteedLimit); -// guaranteedBuyersLimit[_th] = _limit; -// GuaranteedAddress(_th, _limit); -// } - -// /// @notice If anybody sends Ether directly to this contract, consider he is -// /// getting SNTs. -// function () public payable notPaused { -// proxyPayment(msg.sender); -// } - - -// ////////// -// // MiniMe Controller functions -// ////////// - -// /// @notice This method will generally be called by the SNT token contract to -// /// acquire SNTs. Or directly from third parties that want to acquire SNTs in -// /// behalf of a token holder. -// /// @param _th SNT holder where the SNTs will be minted. -// function proxyPayment(address _th) public payable notPaused initialized contributionOpen returns (bool) { -// require(_th != 0x0); -// if (guaranteedBuyersLimit[_th] > 0) { -// buyGuaranteed(_th); -// } else { -// buyNormal(_th); -// } -// return true; -// } - -// function onTransfer(address, address, uint256) public returns (bool) { -// return false; -// } - -// function onApprove(address, address, uint256) public returns (bool) { -// return false; -// } - -// function buyNormal(address _th) internal { -// require(tx.gasprice <= maxGasPrice); - -// // Antispam mechanism -// address caller; -// if (msg.sender == address(SNT)) { -// caller = _th; -// } else { -// caller = msg.sender; -// } - -// // Do not allow contracts to game the system -// require(!isContract(caller)); - -// require(getBlockNumber().sub(lastCallBlock[caller]) >= maxCallFrequency); -// lastCallBlock[caller] = getBlockNumber(); - -// uint256 toCollect = dynamicCeiling.toCollect(totalNormalCollected); - -// uint256 toFund; -// if (msg.value <= toCollect) { -// toFund = msg.value; -// } else { -// toFund = toCollect; -// } - -// totalNormalCollected = totalNormalCollected.add(toFund); -// doBuy(_th, toFund, false); -// } - -// function buyGuaranteed(address _th) internal { -// uint256 toCollect = guaranteedBuyersLimit[_th]; - -// uint256 toFund; -// if (guaranteedBuyersBought[_th].add(msg.value) > toCollect) { -// toFund = toCollect.sub(guaranteedBuyersBought[_th]); -// } else { -// toFund = msg.value; -// } - -// guaranteedBuyersBought[_th] = guaranteedBuyersBought[_th].add(toFund); -// totalGuaranteedCollected = totalGuaranteedCollected.add(toFund); -// doBuy(_th, toFund, true); -// } - -// function doBuy(address _th, uint256 _toFund, bool _guaranteed) internal { -// assert(msg.value >= _toFund); // Not needed, but double check. -// assert(totalCollected() <= failSafeLimit); - -// if (_toFund > 0) { -// uint256 tokensGenerated = _toFund.mul(exchangeRate); -// assert(SNT.generateTokens(_th, tokensGenerated)); -// destEthDevs.transfer(_toFund); -// NewSale(_th, _toFund, tokensGenerated, _guaranteed); -// } - -// uint256 toReturn = msg.value.sub(_toFund); -// if (toReturn > 0) { -// // If the call comes from the Token controller, -// // then we return it to the token Holder. -// // Otherwise we return to the sender. -// if (msg.sender == address(SNT)) { -// _th.transfer(toReturn); -// } else { -// msg.sender.transfer(toReturn); -// } -// } -// } - -// // NOTE on Percentage format -// // Right now, Solidity does not support decimal numbers. (This will change very soon) -// // So in this contract we use a representation of a percentage that consist in -// // expressing the percentage in "x per 10**18" -// // This format has a precision of 16 digits for a percent. -// // Examples: -// // 3% = 3*(10**16) -// // 100% = 100*(10**16) = 10**18 -// // -// // To get a percentage of a value we do it by first multiplying it by the percentage in (x per 10^18) -// // and then divide it by 10**18 -// // -// // Y * X(in x per 10**18) -// // X% of Y = ------------------------- -// // 100(in x per 10**18) -// // - - -// /// @notice This method will can be called by the owner before the contribution period -// /// end or by anybody after the `endBlock`. This method finalizes the contribution period -// /// by creating the remaining tokens and transferring the controller to the configured -// /// controller. -// function finalize() public initialized { -// require(getBlockNumber() >= startBlock); -// require(msg.sender == owner || getBlockNumber() > endBlock); -// require(finalizedBlock == 0); - -// // Do not allow termination until all curves revealed. -// require(dynamicCeiling.allRevealed()); - -// // Allow premature finalization if final limit is reached -// if (getBlockNumber() <= endBlock) { -// var (,lastLimit,,) = dynamicCeiling.curves(dynamicCeiling.revealedCurves().sub(1)); -// require(totalNormalCollected >= lastLimit); -// } - -// finalizedBlock = getBlockNumber(); -// finalizedTime = now; - -// uint256 percentageToSgt; -// if (SGT.totalSupply() >= maxSGTSupply) { -// percentageToSgt = percent(10); // 10% -// } else { - -// // -// // SGT.totalSupply() -// // percentageToSgt = 10% * ------------------- -// // maxSGTSupply -// // -// percentageToSgt = percent(10).mul(SGT.totalSupply()).div(maxSGTSupply); -// } - -// uint256 percentageToDevs = percent(20); // 20% - - -// // -// // % To Contributors = 41% + (10% - % to SGT holders) -// // -// uint256 percentageToContributors = percent(41).add(percent(10).sub(percentageToSgt)); - -// uint256 percentageToReserve = percent(29); - - -// // SNT.totalSupply() -> Tokens minted during the contribution -// // totalTokens -> Total tokens that should be after the allocation -// // of devTokens, sgtTokens and reserve -// // percentageToContributors -> Which percentage should go to the -// // contribution participants -// // (x per 10**18 format) -// // percent(100) -> 100% in (x per 10**18 format) -// // -// // percentageToContributors -// // SNT.totalSupply() = -------------------------- * totalTokens => -// // percent(100) -// // -// // -// // percent(100) -// // => totalTokens = ---------------------------- * SNT.totalSupply() -// // percentageToContributors -// // -// uint256 totalTokens = SNT.totalSupply().mul(percent(100)).div(percentageToContributors); - - -// // Generate tokens for SGT Holders. - -// // -// // percentageToReserve -// // reserveTokens = ----------------------- * totalTokens -// // percentage(100) -// // -// assert(SNT.generateTokens( -// destTokensReserve, -// totalTokens.mul(percentageToReserve).div(percent(100)))); - -// // -// // percentageToSgt -// // sgtTokens = ----------------------- * totalTokens -// // percentage(100) -// // -// assert(SNT.generateTokens( -// destTokensSgt, -// totalTokens.mul(percentageToSgt).div(percent(100)))); - - -// // -// // percentageToDevs -// // devTokens = ----------------------- * totalTokens -// // percentage(100) -// // -// assert(SNT.generateTokens( -// destTokensDevs, -// totalTokens.mul(percentageToDevs).div(percent(100)))); - -// SNT.changeController(sntController); - -// Finalized(); -// } - -// function percent(uint256 p) internal returns (uint256) { -// return p.mul(10**16); -// } - -// /// @dev Internal function to determine if an address is a contract -// /// @param _addr The address being queried -// /// @return True if `_addr` is a contract -// function isContract(address _addr) constant internal returns (bool) { -// if (_addr == 0) return false; -// uint256 size; -// assembly { -// size := extcodesize(_addr) -// } -// return (size > 0); -// } - - -// ////////// -// // Constant functions -// ////////// - -// /// @return Total tokens issued in weis. -// function tokensIssued() public constant returns (uint256) { -// return SNT.totalSupply(); -// } - -// /// @return Total Ether collected. -// function totalCollected() public constant returns (uint256) { -// return totalNormalCollected.add(totalGuaranteedCollected); -// } - - -// ////////// -// // Testing specific methods -// ////////// - -// /// @notice This function is overridden by the test Mocks. -// function getBlockNumber() internal constant returns (uint256) { -// return block.number; -// } - - -// ////////// -// // Safety Methods -// ////////// - -// /// @notice This method can be used by the controller to extract mistakenly -// /// sent tokens to this contract. -// /// @param _token The address of the token contract that you want to recover -// /// set to 0 in case you want to extract ether. -// function claimTokens(address _token) public onlyOwner { -// if (SNT.controller() == address(this)) { -// SNT.claimTokens(_token); -// } -// if (_token == 0x0) { -// owner.transfer(this.balance); -// return; -// } - -// ERC20Token token = ERC20Token(_token); -// uint256 balance = token.balanceOf(this); -// token.transfer(owner, balance); -// ClaimedTokens(_token, owner, balance); -// } - - -// /// @notice Pauses the contribution if there is any issue -// function pauseContribution() onlyOwner { -// paused = true; -// } - -// /// @notice Resumes the contribution -// function resumeContribution() onlyOwner { -// paused = false; -// } - -// event ClaimedTokens(address indexed _token, address indexed _controller, uint256 _amount); -// event NewSale(address indexed _th, uint256 _amount, uint256 _tokens, bool _guaranteed); -// event GuaranteedAddress(address indexed _th, uint256 _limit); -// event Finalized(); -// } - - -// /* -// Copyright 2017, Jordi Baylina - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// */ - -// /// @title ContributionWallet Contract -// /// @author Jordi Baylina -// /// @dev This contract will be hold the Ether during the contribution period. -// /// The idea of this contract is to avoid recycling Ether during the contribution -// /// period. So all the ETH collected will be locked here until the contribution -// /// period ends - -// // @dev Contract to hold sale raised funds during the sale period. -// // Prevents attack in which the Aragon Multisig sends raised ether -// // to the sale contract to mint tokens to itself, and getting the -// // funds back immediately. - - - -// contract ContributionWallet { - -// // Public variables -// address public multisig; -// uint256 public endBlock; -// StatusContribution public contribution; - -// // @dev Constructor initializes public variables -// // @param _multisig The address of the multisig that will receive the funds -// // @param _endBlock Block after which the multisig can request the funds -// // @param _contribution Address of the StatusContribution contract -// function ContributionWallet(address _multisig, uint256 _endBlock, address _contribution) { -// require(_multisig != 0x0); -// require(_contribution != 0x0); -// require(_endBlock != 0 && _endBlock <= 4000000); -// multisig = _multisig; -// endBlock = _endBlock; -// contribution = StatusContribution(_contribution); -// } - -// // @dev Receive all sent funds without any further logic -// function () public payable {} - -// // @dev Withdraw function sends all the funds to the wallet if conditions are correct -// function withdraw() public { -// require(msg.sender == multisig); // Only the multisig can request it -// require(block.number > endBlock || // Allow after end block -// contribution.finalizedBlock() != 0); // Allow when sale is finalized -// multisig.transfer(this.balance); -// } - -// } - - -// /* -// Copyright 2017, Jordi Baylina - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// */ - -// /// @title DevTokensHolder Contract -// /// @author Jordi Baylina -// /// @dev This contract will hold the tokens of the developers. -// /// Tokens will not be able to be collected until 6 months after the contribution -// /// period ends. And it will be increasing linearly until 2 years. - - -// // collectable tokens -// // | _/-------- vestedTokens rect -// // | _/ -// // | _/ -// // | _/ -// // | _/ -// // | _/ -// // | _/ -// // | _/ -// // | | -// // | . | -// // | . | -// // | . | -// // +===+======+--------------+----------> time -// // Contrib 6 Months 24 Months -// // End - - - -// contract DevTokensHolder is Owned { -// using SafeMath for uint256; - -// uint256 collectedTokens; -// StatusContribution contribution; -// MiniMeToken snt; - -// function DevTokensHolder(address _owner, address _contribution, address _snt) { -// owner = _owner; -// contribution = StatusContribution(_contribution); -// snt = MiniMeToken(_snt); -// } - - -// /// @notice The Dev (Owner) will call this method to extract the tokens -// function collectTokens() public onlyOwner { -// uint256 balance = snt.balanceOf(address(this)); -// uint256 total = collectedTokens.add(balance); - -// uint256 finalizedTime = contribution.finalizedTime(); - -// require(finalizedTime > 0 && getTime() > finalizedTime.add(months(6))); - -// uint256 canExtract = total.mul(getTime().sub(finalizedTime)).div(months(24)); - -// canExtract = canExtract.sub(collectedTokens); - -// if (canExtract > balance) { -// canExtract = balance; -// } - -// collectedTokens = collectedTokens.add(canExtract); -// assert(snt.transfer(owner, canExtract)); - -// TokensWithdrawn(owner, canExtract); -// } - -// function months(uint256 m) internal returns (uint256) { -// return m.mul(30 days); -// } - -// function getTime() internal returns (uint256) { -// return now; -// } - - -// ////////// -// // Safety Methods -// ////////// - -// /// @notice This method can be used by the controller to extract mistakenly -// /// sent tokens to this contract. -// /// @param _token The address of the token contract that you want to recover -// /// set to 0 in case you want to extract ether. -// function claimTokens(address _token) public onlyOwner { -// require(_token != address(snt)); -// if (_token == 0x0) { -// owner.transfer(this.balance); -// return; -// } - -// ERC20Token token = ERC20Token(_token); -// uint256 balance = token.balanceOf(this); -// token.transfer(owner, balance); -// ClaimedTokens(_token, owner, balance); -// } - -// event ClaimedTokens(address indexed _token, address indexed _controller, uint256 _amount); -// event TokensWithdrawn(address indexed _holder, uint256 _amount); -// } - - -// /* -// Copyright 2017, Jordi Baylina - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// */ - -// /// @title SGTExchanger Contract -// /// @author Jordi Baylina -// /// @dev This contract will be used to distribute SNT between SGT holders. -// /// SGT token is not transferable, and we just keep an accounting between all tokens -// /// deposited and the tokens collected. -// /// The controllerShip of SGT should be transferred to this contract before the -// /// contribution period starts. - - -// contract SGTExchanger is TokenController, Owned { -// using SafeMath for uint256; - -// mapping (address => uint256) public collected; -// uint256 public totalCollected; -// MiniMeToken public sgt; -// MiniMeToken public snt; -// StatusContribution public statusContribution; - -// function SGTExchanger(address _sgt, address _snt, address _statusContribution) { -// sgt = MiniMeToken(_sgt); -// snt = MiniMeToken(_snt); -// statusContribution = StatusContribution(_statusContribution); -// } - -// /// @notice This method should be called by the SGT holders to collect their -// /// corresponding SNTs -// function collect() public { -// uint256 finalizedBlock = statusContribution.finalizedBlock(); - -// require(finalizedBlock != 0); -// require(getBlockNumber() > finalizedBlock); - -// uint256 total = totalCollected.add(snt.balanceOf(address(this))); - -// uint256 balance = sgt.balanceOfAt(msg.sender, finalizedBlock); - -// // First calculate how much correspond to him -// uint256 amount = total.mul(balance).div(sgt.totalSupplyAt(finalizedBlock)); - -// // And then subtract the amount already collected -// amount = amount.sub(collected[msg.sender]); - -// require(amount > 0); // Notify the user that there are no tokens to exchange - -// totalCollected = totalCollected.add(amount); -// collected[msg.sender] = collected[msg.sender].add(amount); - -// assert(snt.transfer(msg.sender, amount)); - -// TokensCollected(msg.sender, amount); -// } - -// function proxyPayment(address) public payable returns (bool) { -// throw; -// } - -// function onTransfer(address, address, uint256) public returns (bool) { -// return false; -// } - -// function onApprove(address, address, uint256) public returns (bool) { -// return false; -// } - -// ////////// -// // Testing specific methods -// ////////// - -// /// @notice This function is overridden by the test Mocks. -// function getBlockNumber() internal constant returns (uint256) { -// return block.number; -// } - -// ////////// -// // Safety Method -// ////////// - -// /// @notice This method can be used by the controller to extract mistakenly -// /// sent tokens to this contract. -// /// @param _token The address of the token contract that you want to recover -// /// set to 0 in case you want to extract ether. -// function claimTokens(address _token) public onlyOwner { -// require(_token != address(snt)); -// if (_token == 0x0) { -// owner.transfer(this.balance); -// return; -// } - -// ERC20Token token = ERC20Token(_token); -// uint256 balance = token.balanceOf(this); -// token.transfer(owner, balance); -// ClaimedTokens(_token, owner, balance); -// } - -// event ClaimedTokens(address indexed _token, address indexed _controller, uint256 _amount); -// event TokensCollected(address indexed _holder, uint256 _amount); - -// } - -// /* -// Copyright 2017, Jordi Baylina - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// */ - -// /// @title SNTPlaceholder Contract -// /// @author Jordi Baylina -// /// @dev The SNTPlaceholder contract will take control over the SNT after the contribution -// /// is finalized and before the Status Network is deployed. -// /// The contract allows for SNT transfers and transferFrom and implements the -// /// logic for transferring control of the token to the network when the offering -// /// asks it to do so. - - -// contract SNTPlaceHolder is TokenController, Owned { -// using SafeMath for uint256; - -// MiniMeToken public snt; -// StatusContribution public contribution; -// uint256 public activationTime; -// address public sgtExchanger; - -// /// @notice Constructor -// /// @param _owner Trusted owner for this contract. -// /// @param _snt SNT token contract address -// /// @param _contribution StatusContribution contract address -// /// @param _sgtExchanger SGT-SNT Exchange address. (During the first week -// /// only this exchanger will be able to move tokens) -// function SNTPlaceHolder(address _owner, address _snt, address _contribution, address _sgtExchanger) { -// owner = _owner; -// snt = MiniMeToken(_snt); -// contribution = StatusContribution(_contribution); -// sgtExchanger = _sgtExchanger; -// } - -// /// @notice The owner of this contract can change the controller of the SNT token -// /// Please, be sure that the owner is a trusted agent or 0x0 address. -// /// @param _newController The address of the new controller - -// function changeController(address _newController) public onlyOwner { -// snt.changeController(_newController); -// ControllerChanged(_newController); -// } - - -// ////////// -// // MiniMe Controller Interface functions -// ////////// - -// // In between the offering and the network. Default settings for allowing token transfers. -// function proxyPayment(address) public payable returns (bool) { -// return false; -// } - -// function onTransfer(address _from, address, uint256) public returns (bool) { -// return transferable(_from); -// } - -// function onApprove(address _from, address, uint256) public returns (bool) { -// return transferable(_from); -// } - -// function transferable(address _from) internal returns (bool) { -// // Allow the exchanger to work from the beginning -// if (activationTime == 0) { -// uint256 f = contribution.finalizedTime(); -// if (f > 0) { -// activationTime = f.add(1 weeks); -// } else { -// return false; -// } -// } -// return (getTime() > activationTime) || (_from == sgtExchanger); -// } - - -// ////////// -// // Testing specific methods -// ////////// - -// /// @notice This function is overrided by the test Mocks. -// function getTime() internal returns (uint256) { -// return now; -// } - - -// ////////// -// // Safety Methods -// ////////// - -// /// @notice This method can be used by the controller to extract mistakenly -// /// sent tokens to this contract. -// /// @param _token The address of the token contract that you want to recover -// /// set to 0 in case you want to extract ether. -// function claimTokens(address _token) public onlyOwner { -// if (snt.controller() == address(this)) { -// snt.claimTokens(_token); -// } -// if (_token == 0x0) { -// owner.transfer(this.balance); -// return; -// } - -// ERC20Token token = ERC20Token(_token); -// uint256 balance = token.balanceOf(this); -// token.transfer(owner, balance); -// ClaimedTokens(_token, owner, balance); -// } - -// event ClaimedTokens(address indexed _token, address indexed _controller, uint256 _amount); -// event ControllerChanged(address indexed _newController); -// } \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index b383ef0..e83bd2c 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -23,7 +23,22 @@ task("accounts", "Prints the list of accounts", async (taskArgs, hre) => { // Go to https://hardhat.org/config/ to learn more const config: HardhatUserConfig = { - solidity: "0.7.4", + solidity: { + compilers: [ + { + version: "0.7.4", + }, + { + version: "0.4.11" + }, + ], + overrides: { + "contracts/STT.sol": { + version: "0.4.11", + settings: { } + } + } + }, networks: { goerli: { url: GOERLI_URL, diff --git a/package-lock.json b/package-lock.json index db30cad..6f6edca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "chai": "^4.3.6", "ethereum-waffle": "^3.4.4", "ethers": "^5.6.9", - "hardhat": "^2.10.1", + "hardhat": "^2.11.1", "hardhat-gas-reporter": "^1.0.8", "solidity-coverage": "^0.7.21", "ts-node": "^10.8.1", @@ -380,34 +380,6 @@ "node": ">=10.0" } }, - "node_modules/@ethereumjs/block": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", - "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" - } - }, - "node_modules/@ethereumjs/blockchain": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", - "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/ethash": "^1.1.0", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "level-mem": "^5.0.1", - "lru-cache": "^5.1.1", - "semaphore-async-await": "^1.5.1" - } - }, "node_modules/@ethereumjs/common": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", @@ -418,19 +390,6 @@ "ethereumjs-util": "^7.1.5" } }, - "node_modules/@ethereumjs/ethash": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", - "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.5.0", - "@types/levelup": "^4.3.0", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.1.1", - "miller-rabin": "^4.0.0" - } - }, "node_modules/@ethereumjs/tx": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", @@ -441,26 +400,6 @@ "ethereumjs-util": "^7.1.5" } }, - "node_modules/@ethereumjs/vm": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.9.3.tgz", - "integrity": "sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.6.3", - "@ethereumjs/blockchain": "^5.5.3", - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.4", - "rustbn.js": "~0.2.0" - } - }, "node_modules/@ethersproject/abi": { "version": "5.6.4", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.6.4.tgz", @@ -1312,6 +1251,370 @@ "node": ">= 8" } }, + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-ethash": "^2.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "crc-32": "^1.2.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "dev": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1" + } + }, + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", + "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", + "dev": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", + "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", + "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", + "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", + "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", + "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", + "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", + "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", + "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", + "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", + "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nomiclabs/hardhat-ethers": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.6.tgz", @@ -1745,10 +2048,10 @@ "typechain": "^3.0.0" } }, - "node_modules/@types/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ==", + "node_modules/@types/async-eventemitter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", "dev": true }, "node_modules/@types/bn.js": { @@ -1794,23 +2097,6 @@ "@types/node": "*" } }, - "node_modules/@types/level-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", - "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==", - "dev": true - }, - "node_modules/@types/levelup": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", - "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", - "dev": true, - "dependencies": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" - } - }, "node_modules/@types/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", @@ -1964,20 +2250,46 @@ "node": ">=6.5" } }, - "node_modules/abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "node_modules/abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", "dev": true, "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" }, "engines": { - "node": ">=6" + "node": ">=12" + } + }, + "node_modules/abstract-level/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/accepts": { @@ -2393,6 +2705,27 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, + "node_modules/bigint-crypto-utils": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", + "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", + "dev": true, + "dependencies": { + "bigint-mod-arith": "^3.1.0" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/bigint-mod-arith": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", + "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", + "dev": true, + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/bignumber.js": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", @@ -2511,6 +2844,18 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dev": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2643,15 +2988,6 @@ "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", "dev": true }, - "node_modules/buffer-xor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", - "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.1" - } - }, "node_modules/bufferutil": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", @@ -2747,6 +3083,15 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/cbor": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", @@ -2894,6 +3239,23 @@ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", "dev": true }, + "node_modules/classic-level": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -3157,17 +3519,6 @@ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, - "node_modules/core-js-pure": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.2.tgz", - "integrity": "sha512-t6u7H4Ff/yZNk+zqTr74UjCcZ3k8ApBryeLLV4rYQd9aF3gqmjjGjjR44ENfeBMH8VVvSynIjAJ0mUuFhzQtrA==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -3418,35 +3769,6 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, - "node_modules/deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "dev": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deferred-leveldown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -3652,21 +3974,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "dev": true, - "dependencies": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -3697,18 +4004,6 @@ "node": ">=6" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -14639,20 +14934,25 @@ } }, "node_modules/hardhat": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.10.1.tgz", - "integrity": "sha512-0FN9TyCtn7Lt25SB2ei2G7nA2rZjP+RN6MvFOm+zYwherxLZNo6RbD8nDz88eCbhRapevmXqOiL2nM8INKsjmA==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", + "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", "dev": true, "dependencies": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/blockchain": "^5.5.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/tx": "^3.5.1", - "@ethereumjs/vm": "^5.9.0", "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", + "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", + "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", + "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", + "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", + "@nomicfoundation/solidity-analyzer": "^0.0.3", "@sentry/node": "^5.18.1", - "@solidity-parser/parser": "^0.14.2", "@types/bn.js": "^5.1.0", "@types/lru-cache": "^5.1.0", "abort-controller": "^3.0.0", @@ -14667,15 +14967,14 @@ "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^7.1.4", "find-up": "^2.1.0", "fp-ts": "1.19.3", "fs-extra": "^7.0.1", "glob": "7.2.0", "immutable": "^4.0.0-rc.12", "io-ts": "1.10.4", + "keccak": "^3.0.2", "lodash": "^4.17.11", - "merkle-patricia-tree": "^4.2.4", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", @@ -14683,11 +14982,9 @@ "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", - "slash": "^3.0.0", "solc": "0.7.3", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", - "true-case-path": "^2.2.1", "tsort": "0.0.1", "undici": "^5.4.0", "uuid": "^8.3.2", @@ -15041,12 +15338,6 @@ "node": ">= 4" } }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, "node_modules/immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -15712,119 +16003,67 @@ "node": ">=0.10.0" } }, - "node_modules/level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", - "dev": true, - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "dev": true, - "dependencies": { - "errno": "~0.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-mem": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", - "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "dependencies": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", - "dev": true, - "dependencies": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" + "node": ">=12" }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" } }, "node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "dev": true, - "dependencies": { - "xtend": "^4.0.2" - }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/level-ws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", - "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" + "buffer": "^6.0.3", + "module-error": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "node_modules/level-transcoder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/levn": { @@ -16006,12 +16245,6 @@ "yallist": "^3.0.2" } }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -16053,45 +16286,20 @@ "node": ">= 0.6" } }, - "node_modules/memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", - "dev": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/memdown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "node_modules/memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", "dev": true, "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/memdown/node_modules/immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "dev": true - }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -16116,20 +16324,6 @@ "node": ">= 8" } }, - "node_modules/merkle-patricia-tree": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", - "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", - "dev": true, - "dependencies": { - "@types/levelup": "^4.3.0", - "ethereumjs-util": "^7.1.4", - "level-mem": "^5.0.1", - "level-ws": "^2.0.0", - "readable-stream": "^3.6.0", - "semaphore-async-await": "^1.5.1" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -16494,6 +16688,15 @@ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", "dev": true }, + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -16561,6 +16764,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -17279,12 +17488,6 @@ "node": ">= 0.10" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -17806,6 +18009,29 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", @@ -17993,15 +18219,6 @@ "node": ">=10.0.0" } }, - "node_modules/semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", - "dev": true, - "engines": { - "node": ">=4.1" - } - }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -19004,12 +19221,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "node_modules/true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", - "dev": true - }, "node_modules/ts-essentials": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz", @@ -20974,34 +21185,6 @@ "postinstall-postinstall": "^2.1.0" } }, - "@ethereumjs/block": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", - "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" - } - }, - "@ethereumjs/blockchain": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", - "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", - "dev": true, - "requires": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/ethash": "^1.1.0", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "level-mem": "^5.0.1", - "lru-cache": "^5.1.1", - "semaphore-async-await": "^1.5.1" - } - }, "@ethereumjs/common": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", @@ -21012,19 +21195,6 @@ "ethereumjs-util": "^7.1.5" } }, - "@ethereumjs/ethash": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", - "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", - "dev": true, - "requires": { - "@ethereumjs/block": "^3.5.0", - "@types/levelup": "^4.3.0", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.1.1", - "miller-rabin": "^4.0.0" - } - }, "@ethereumjs/tx": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", @@ -21035,26 +21205,6 @@ "ethereumjs-util": "^7.1.5" } }, - "@ethereumjs/vm": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.9.3.tgz", - "integrity": "sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg==", - "dev": true, - "requires": { - "@ethereumjs/block": "^3.6.3", - "@ethereumjs/blockchain": "^5.5.3", - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.4", - "rustbn.js": "~0.2.0" - } - }, "@ethersproject/abi": { "version": "5.6.4", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.6.4.tgz", @@ -21569,6 +21719,247 @@ "fastq": "^1.6.0" } }, + "@nomicfoundation/ethereumjs-block": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-blockchain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-ethash": "^2.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + } + }, + "@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "crc-32": "^1.2.0" + } + }, + "@nomicfoundation/ethereumjs-ethash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-evm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, + "@nomicfoundation/ethereumjs-rlp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "dev": true + }, + "@nomicfoundation/ethereumjs-statemanager": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1" + } + }, + "@nomicfoundation/ethereumjs-trie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + } + }, + "@nomicfoundation/ethereumjs-tx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-util": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-vm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, + "@nomicfoundation/solidity-analyzer": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", + "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", + "dev": true, + "requires": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" + } + }, + "@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", + "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", + "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", + "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", + "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", + "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", + "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", + "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", + "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", + "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", + "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", + "dev": true, + "optional": true + }, "@nomiclabs/hardhat-ethers": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.6.tgz", @@ -21952,10 +22343,10 @@ "ethers": "^5.0.2" } }, - "@types/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ==", + "@types/async-eventemitter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", "dev": true }, "@types/bn.js": { @@ -22001,23 +22392,6 @@ "@types/node": "*" } }, - "@types/level-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", - "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==", - "dev": true - }, - "@types/levelup": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", - "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", - "dev": true, - "requires": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" - } - }, "@types/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", @@ -22168,17 +22542,31 @@ "event-target-shim": "^5.0.0" } }, - "abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", "dev": true, "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } } }, "accepts": { @@ -22502,6 +22890,21 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, + "bigint-crypto-utils": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", + "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", + "dev": true, + "requires": { + "bigint-mod-arith": "^3.1.0" + } + }, + "bigint-mod-arith": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", + "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", + "dev": true + }, "bignumber.js": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", @@ -22603,6 +23006,18 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dev": true, + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -22723,15 +23138,6 @@ "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", "dev": true }, - "buffer-xor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", - "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, "bufferutil": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", @@ -22801,6 +23207,12 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, + "catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "dev": true + }, "cbor": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", @@ -22918,6 +23330,19 @@ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", "dev": true }, + "classic-level": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "dev": true, + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -23141,12 +23566,6 @@ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, - "core-js-pure": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.2.tgz", - "integrity": "sha512-t6u7H4Ff/yZNk+zqTr74UjCcZ3k8ApBryeLLV4rYQd9aF3gqmjjGjjR44ENfeBMH8VVvSynIjAJ0mUuFhzQtrA==", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -23351,31 +23770,6 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, - "deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "dev": true, - "requires": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - } - } - }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -23551,18 +23945,6 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, - "encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "dev": true, - "requires": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -23587,15 +23969,6 @@ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -32071,20 +32444,25 @@ } }, "hardhat": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.10.1.tgz", - "integrity": "sha512-0FN9TyCtn7Lt25SB2ei2G7nA2rZjP+RN6MvFOm+zYwherxLZNo6RbD8nDz88eCbhRapevmXqOiL2nM8INKsjmA==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", + "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", "dev": true, "requires": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/blockchain": "^5.5.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/tx": "^3.5.1", - "@ethereumjs/vm": "^5.9.0", "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", + "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", + "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", + "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", + "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", + "@nomicfoundation/solidity-analyzer": "^0.0.3", "@sentry/node": "^5.18.1", - "@solidity-parser/parser": "^0.14.2", "@types/bn.js": "^5.1.0", "@types/lru-cache": "^5.1.0", "abort-controller": "^3.0.0", @@ -32099,15 +32477,14 @@ "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^7.1.4", "find-up": "^2.1.0", "fp-ts": "1.19.3", "fs-extra": "^7.0.1", "glob": "7.2.0", "immutable": "^4.0.0-rc.12", "io-ts": "1.10.4", + "keccak": "^3.0.2", "lodash": "^4.17.11", - "merkle-patricia-tree": "^4.2.4", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", @@ -32115,11 +32492,9 @@ "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", - "slash": "^3.0.0", "solc": "0.7.3", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", - "true-case-path": "^2.2.1", "tsort": "0.0.1", "undici": "^5.4.0", "uuid": "^8.3.2", @@ -32372,12 +32747,6 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, "immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -32862,92 +33231,42 @@ "invert-kv": "^1.0.0" } }, - "level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "requires": { - "buffer": "^5.6.0" + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" } }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "dev": true }, - "level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - } - }, - "level-mem": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", - "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", - "dev": true, - "requires": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" - } - }, - "level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", - "dev": true, - "requires": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" - } - }, - "level-supports": { + "level-transcoder": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "requires": { - "xtend": "^4.0.2" - } - }, - "level-ws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", - "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" - } - }, - "levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "dev": true, - "requires": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } } }, "levn": { @@ -33092,12 +33411,6 @@ "yallist": "^3.0.2" } }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -33133,39 +33446,15 @@ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, - "memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", "dev": true, "requires": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "dev": true - } + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" } }, "memorystream": { @@ -33186,20 +33475,6 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, - "merkle-patricia-tree": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", - "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", - "dev": true, - "requires": { - "@types/levelup": "^4.3.0", - "ethereumjs-util": "^7.1.4", - "level-mem": "^5.0.1", - "level-ws": "^2.0.0", - "readable-stream": "^3.6.0", - "semaphore-async-await": "^1.5.1" - } - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -33475,6 +33750,12 @@ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", "dev": true }, + "module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -33535,6 +33816,12 @@ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, + "napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -34081,12 +34368,6 @@ "ipaddr.js": "1.9.1" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -34478,6 +34759,15 @@ "queue-microtask": "^1.2.2" } }, + "run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", @@ -34619,12 +34909,6 @@ "node-gyp-build": "^4.2.0" } }, - "semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -35440,12 +35724,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", - "dev": true - }, "ts-essentials": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz", diff --git a/package.json b/package.json index e5b68c7..f8188a6 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "chai": "^4.3.6", "ethereum-waffle": "^3.4.4", "ethers": "^5.6.9", - "hardhat": "^2.10.1", + "hardhat": "^2.11.1", "hardhat-gas-reporter": "^1.0.8", "solidity-coverage": "^0.7.21", "ts-node": "^10.8.1", diff --git a/scripts/deploy-stt.ts b/scripts/deploy-stt.ts new file mode 100644 index 0000000..abf1a99 --- /dev/null +++ b/scripts/deploy-stt.ts @@ -0,0 +1,26 @@ +import { ethers } from "hardhat"; + +async function main() { + // Deploy STT (it's also deployed at 0x3d6afaa395c31fcd391fe3d562e75fe9e8ec7e6a in Goerli) + const MiniMeTokenFactory = await ethers.getContractFactory("MiniMeTokenFactory"); + const minimeTokenFactory = await MiniMeTokenFactory.deploy(); + await minimeTokenFactory.deployed(); + console.log("minimeTokenFactory deployed to:", minimeTokenFactory.address); + + const STT = await ethers.getContractFactory("STT"); + const stt = await STT.deploy(minimeTokenFactory.address); + await stt.deployed(); + console.log("STT deployed to:", stt.address); + + // Generating 1337 STT tokens + let stt1337 = ethers.utils.parseUnits("1337", "ether"); + await stt.generateTokens("0x00000000000000000000000000000000AABBCCDD", stt1337); + console.log("Account balance: ", await stt.balanceOf("0x00000000000000000000000000000000AABBCCDD")) +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +});