diff --git a/contracts/ACL.sol b/contracts/ACL.sol deleted file mode 100644 index b1540b7..0000000 --- a/contracts/ACL.sol +++ /dev/null @@ -1,22 +0,0 @@ -pragma ever-solidity >= 0.61.2; - -import './Owned.sol'; - - -contract ACL is Owned { - mapping(address => bool) public _isAuditor; - - constructor() public {tvm.accept();} - - function isAuditor(address _is_auditor) external responsible returns(bool) { - return{value: 0, bounce: false, flag: 64} _isAuditor[_is_auditor]; - } - - function addAuditor(address _auditor) public onlyOwner { - _isAuditor[_auditor] = true; - } - - function removeAuditor(address _auditor) public onlyOwner { - _isAuditor[_auditor] = false; - } -} \ No newline at end of file diff --git a/contracts/AssetFactory.sol b/contracts/AssetFactory.sol new file mode 100644 index 0000000..2882741 --- /dev/null +++ b/contracts/AssetFactory.sol @@ -0,0 +1,79 @@ +pragma ever-solidity ^0.62.0; + + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import 'TIP3/additional/TokenFactory.sol'; //модифицированный TokenFactory от Broxus +//В своем коде он использует TokenRoot. В Everscale токены принято делать такими, чтобы не было глобального +// mapping(address => uint) balances, потому что storage тут не бесплатен. Вместо этого для каждого владельца токена +// деплоится TokenWallet. TokenWallet предоставляет API для пользователя(transfer(), burn() и т.д.) + + +//AssetFactory - это просто TokenFactory с вайтлистом. Создавать токены (деплоить TokenRoot) могут только аудиторы +contract AssetFactory is TokenFactory { + mapping(address => bool) private _isAuditor; //Вайтлист аудиторов + + + //просто прокидываю все аргументы в TokenFactory + constructor( + address owner, //владелец DAO + uint128 deployValue, //количество EVER, с которым будет деплоится токен (TokenRoot) + TvmCell rootCode, //код контракта TokenRoot + TvmCell walletCode, //код кошелька токена (TokenWallet) + TvmCell rootUpgradeableCode, //код upgradable версии TokenRoot + TvmCell walletUpgradeableCode, //код upgradable версии TokenWallet + TvmCell platformCode + ) public TokenFactory(owner, deployValue, rootCode, walletCode, rootUpgradeableCode, walletUpgradeableCode, platformCode) {} + + + //view функция для проверки, является ли определнный адрес аудитором + function isAuditor(address auditor) public view responsible returns(bool) { + return{value: 0, bounce: false, flag: 64} _isAuditor[auditor]; + } + + //Добавить аудитора. Делать это может только Owner aka Оператор + function addAuditor(address auditor) public onlyOwner { + _isAuditor[auditor] = true; + } + + //Удалить аудитора. Аналогично, функция только для Owner'a (Оператора) + function removeAuditor(address auditor) public onlyOwner { + _isAuditor[auditor] = false; + } + + //Функция деплоя токена. То же самое, что deployRoot в TokenFactory, но перед деплоем проврека на то, + //является ли msg.sender аудитором. + function deployRoot( + string name, + string symbol, + uint8 decimals, + address owner, + address initialSupplyTo, + uint128 initialSupply, + uint128 deployWalletValue, + bool mintDisabled, + bool burnByRootDisabled, + bool burnPaused, + address remainingGasTo, + bool upgradeable + ) public responsible virtual override returns (address) { + require(_isAuditor[msg.sender]); + address root = super.deployRoot( + name, + symbol, + decimals, + owner, + initialSupplyTo, + initialSupply, + deployWalletValue, + mintDisabled, + burnByRootDisabled, + burnPaused, + remainingGasTo, + upgradeable + ); + + return {value: 0, flag: 128, bounce: false} root; + } +} \ No newline at end of file diff --git a/contracts/ERC20/ERC20.sol b/contracts/ERC20/ERC20.sol deleted file mode 100644 index 5e9ca02..0000000 --- a/contracts/ERC20/ERC20.sol +++ /dev/null @@ -1,105 +0,0 @@ -pragma ever-solidity >= 0.61.2; -import './IERC20.sol'; -import '../Owned.sol'; - -/** - * @title Token contract represents any asset in digital economy - */ -contract ERC20 is IERC20, Owned { - /* Short description of token */ - string public name; - string public symbol; - - /* Fixed point position */ - uint8 public decimals; - - /* Token approvement system */ - mapping(address => uint256) balances; - mapping(address => mapping(address => uint256)) allowances; - - /* Token constructor */ - constructor(string _name, string _symbol, uint8 _decimals, uint256 _count) public { - tvm.accept(); - name = _name; - symbol = _symbol; - decimals = _decimals; - totalSupply = _count; - balances[msg.sender] = _count; - } - - /** - * @dev Get balance of plain address - * @param _owner is a target address - * @return amount of tokens on balance - */ - function balanceOf(address _owner) public override view responsible returns (uint256) - { return {value: 0, bounce: false, flag: 64} balances[_owner]; } - - /** - * @dev Take allowed tokens - * @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) public override view returns (uint256) - { return allowances[_owner][_spender]; } - - /** - * @dev Transfer self tokens to given address - * @param _to destination address - * @param _value amount of token values to send - * @notice `_value` tokens will be sended to `_to` - * @return `true` when transfer done - */ - function transfer(address _to, uint256 _value) public override returns (bool) { - if (balances[msg.sender] >= _value) { - balances[msg.sender] -= _value; - balances[_to] += _value; - emit Transfer(msg.sender, _to, _value); - return true; - } - return false; - } - - /** - * @dev Transfer with approvement mechainsm - * @param _from source address, `_value` tokens shold be approved for `sender` - * @param _to destination address - * @param _value amount of token values to send - * @notice from `_from` will be sended `_value` tokens to `_to` - * @return `true` when transfer is done - */ - function transferFrom(address _from, address _to, uint256 _value) public override returns (bool) { - uint256 avail = allowances[_from][msg.sender] - > balances[_from] ? balances[_from] - : allowances[_from][msg.sender]; - if (avail >= _value) { - allowances[_from][msg.sender] -= _value; - balances[_from] -= _value; - balances[_to] += _value; - emit Transfer(_from, _to, _value); - return true; - } - return false; - } - - /** - * @dev Give to target address ability for self token manipulation without sending - * @param _spender target address (future requester) - * @param _value amount of token values for approving - */ - function approve(address _spender, uint256 _value) public override returns (bool) { - allowances[msg.sender][_spender] += _value; - emit Approval(msg.sender, _spender, _value); - return true; - } - - /** - * @dev Reset count of tokens approved for given address - * @param _spender target address (future requester) - */ - function unapprove(address _spender) public - { allowances[msg.sender][_spender] = 0; } - - -} diff --git a/contracts/ERC20/ERC20ACL.sol b/contracts/ERC20/ERC20ACL.sol deleted file mode 100644 index a0c1f6a..0000000 --- a/contracts/ERC20/ERC20ACL.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma ever-solidity >= 0.61.2; -import './ERC20Burnable.sol'; - - -contract ERC20ACL is ERC20Burnable { - mapping (address => bool) canMint; - - constructor(string _name, string _symbol, uint8 _decimals, - uint _start_count, address _acl) public - ERC20Burnable(_name, _symbol, _decimals, _start_count, _acl) - {tvm.accept();} - - function addMinter(address _minter) public onlyOwner { - canMint[_minter] = true; - } - - function emission(uint _value) public override { - require(canMint[msg.sender]); - - totalSupply += _value; - balances[msg.sender] += _value; - } -} \ No newline at end of file diff --git a/contracts/ERC20/ERC20Burnable.sol b/contracts/ERC20/ERC20Burnable.sol deleted file mode 100644 index 7d576cf..0000000 --- a/contracts/ERC20/ERC20Burnable.sol +++ /dev/null @@ -1,37 +0,0 @@ -pragma ever-solidity >= 0.61.2; -import './ERC20.sol'; - -contract ERC20Burnable is ERC20 { - - address auditor; - constructor(string _name, string _symbol, uint8 _decimals, - uint _start_count,address _auditor) public - ERC20(_name, _symbol, _decimals, _start_count) - { - tvm.accept(); - auditor = _auditor; - } - - /** - * @dev Token emission - * @param _value amount of token values to emit - * @notice owner balance will be increased by `_value` - */ - function emission(uint _value) public virtual onlyOwner { - totalSupply += _value; - balances[owner] += _value; - } - - - /** - * @dev Burn the token values from sender balance and from total - * @param _value amount of token values for burn - * @notice sender balance will be decreased by `_value` - */ - function burn(uint _value) public { - if (balances[msg.sender] >= _value) { - balances[msg.sender] -= _value; - totalSupply -= _value; - } - } -} diff --git a/contracts/ERC20/IERC20.sol b/contracts/ERC20/IERC20.sol deleted file mode 100644 index 8e58b8b..0000000 --- a/contracts/ERC20/IERC20.sol +++ /dev/null @@ -1,42 +0,0 @@ -pragma ever-solidity >= 0.61.2; - -// Standard token interface (ERC 20) -// https://github.com/ethereum/EIPs/issues/20 -abstract contract IERC20 -{ -// Functions: - /// @return 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) public virtual view responsible returns (uint256); - - /// @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) public virtual returns (bool); - - /// @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) public virtual returns (bool); - - /// @notice `msg.sender` approves `_addr` to spend `_value` tokens - /// @param _spender The address of the account able to transfer the tokens - /// @param _value The amount of wei to be approved for transfer - /// @return Whether the approval was successful or not - function approve(address _spender, uint256 _value) public virtual returns (bool); - - /// @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) public virtual view returns (uint256); - -// Events: - event Transfer(address indexed _from, address indexed _to, uint256 _value); - event Approval(address indexed _owner, address indexed _spender, uint256 _value); -} diff --git a/contracts/Operated.sol b/contracts/Operated.sol deleted file mode 100644 index 1ff542f..0000000 --- a/contracts/Operated.sol +++ /dev/null @@ -1,17 +0,0 @@ -pragma ever-solidity >= 0.61.2; -import './Owned.sol'; -contract Operated is Owned { - // Contract operator - address public operator; - - /** - * @dev Operated contract constructor - * @param _operator is a operator address - */ - constructor(address _operator) public { - tvm.accept(); - operator = _operator; - } - - modifier onlyOperator { require(msg.sender == operator); _; } -} \ No newline at end of file diff --git a/contracts/Owned.sol b/contracts/Owned.sol deleted file mode 100644 index add53a5..0000000 --- a/contracts/Owned.sol +++ /dev/null @@ -1,28 +0,0 @@ -pragma ever-solidity >= 0.61.2; - -/** - * @title Contract for object that have an owner - */ -contract Owned { - /** - * Contract owner address - */ - address public owner; - - constructor() public { - tvm.accept(); - owner = msg.sender; - } - - /** - * @dev Delegate contract to another person - * @param _owner New owner address - */ - function setOwner(address _owner) public onlyOwner - { owner = _owner; } - - /** - * @dev Owner check modifier - */ - modifier onlyOwner { require(msg.sender == owner); _; } -} diff --git a/contracts/TIP3/TokenRoot.sol b/contracts/TIP3/TokenRoot.sol new file mode 100644 index 0000000..dafe6f0 --- /dev/null +++ b/contracts/TIP3/TokenRoot.sol @@ -0,0 +1,110 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./abstract/TokenRootTransferableOwnershipBase.sol"; +import "./abstract/TokenRootBurnPausableBase.sol"; +import "./abstract/TokenRootBurnableByRootBase.sol"; +import "./abstract/TokenRootDisableableMintBase.sol"; + +import "./TokenWallet.sol"; +import "./libraries/TokenErrors.sol"; +import "./libraries/TokenMsgFlag.sol"; + + +/* + @title Fungible token root contract +*/ +contract TokenRoot is + TokenRootTransferableOwnershipBase, + TokenRootBurnPausableBase, + TokenRootBurnableByRootBase, + TokenRootDisableableMintBase +{ + + uint256 static randomNonce_; + address static deployer_; + + constructor( + address initialSupplyTo, + uint128 initialSupply, + uint128 deployWalletValue, + bool mintDisabled, + bool burnByRootDisabled, + bool burnPaused, + address remainingGasTo + ) + public + { + if (msg.pubkey() != 0) { + require(msg.pubkey() == tvm.pubkey() && deployer_.value == 0, TokenErrors.WRONG_ROOT_OWNER); + tvm.accept(); + } else { + require(deployer_.value != 0 && msg.sender == deployer_ || + deployer_.value == 0 && msg.sender == rootOwner_, TokenErrors.WRONG_ROOT_OWNER); + } + + totalSupply_ = 0; + mintDisabled_ = mintDisabled; + burnByRootDisabled_ = burnByRootDisabled; + burnPaused_ = burnPaused; + + tvm.rawReserve(_targetBalance(), 0); + + if (initialSupplyTo.value != 0 && initialSupply != 0) { + TvmCell empty; + _mint(initialSupply, initialSupplyTo, deployWalletValue, remainingGasTo, false, empty); + } else if (remainingGasTo.value != 0) { + remainingGasTo.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }); + } + } + + function supportsInterface(bytes4 interfaceID) override external view responsible returns (bool) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } ( + interfaceID == bytes4(0x3204ec29) || // SID + interfaceID == bytes4(0x4371d8ed) || // TIP3TokenRoot + interfaceID == bytes4(0x0b1fd263) || // ITokenRoot + interfaceID == bytes4(0x18f7cce4) || // IBurnableByRootTokenRoot + interfaceID == bytes4(0x0095b2fa) || // IDisableableMintTokenRoot + interfaceID == bytes4(0x45c92654) || // IBurnPausableTokenRoot + interfaceID == bytes4(0x1df385c6) // ITransferableOwnership + ); + } + + function _targetBalance() override internal pure returns (uint128) { + return TokenGas.TARGET_ROOT_BALANCE; + } + + function _buildWalletInitData(address walletOwner) override internal view returns (TvmCell) { + return tvm.buildStateInit({ + contr: TokenWallet, + varInit: { + root_: address(this), + owner_: walletOwner + }, + pubkey: 0, + code: walletCode_ + }); + } + + function _deployWallet(TvmCell initData, uint128 deployWalletValue, address) + override + internal + view + returns (address) + { + address tokenWallet = new TokenWallet { + stateInit: initData, + value: deployWalletValue, + flag: TokenMsgFlag.SENDER_PAYS_FEES, + code: walletCode_ + }(); + return tokenWallet; + } + +} diff --git a/contracts/TIP3/TokenRootUpgradeable.sol b/contracts/TIP3/TokenRootUpgradeable.sol new file mode 100644 index 0000000..4d04e43 --- /dev/null +++ b/contracts/TIP3/TokenRootUpgradeable.sol @@ -0,0 +1,210 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./abstract/TokenRootTransferableOwnershipBase.sol"; +import "./abstract/TokenRootBurnPausableBase.sol"; +import "./abstract/TokenRootBurnableByRootBase.sol"; +import "./abstract/TokenRootDisableableMintBase.sol"; + +import "./interfaces/ITokenRootUpgradeable.sol"; +import "./interfaces/ITokenWalletUpgradeable.sol"; +import "./interfaces/IVersioned.sol"; +import "./libraries/TokenErrors.sol"; +import "./libraries/TokenMsgFlag.sol"; +import "./libraries/TokenGas.sol"; +import "./TokenWalletPlatform.sol"; + + +/* + @title Fungible token root contract upgradable +*/ +contract TokenRootUpgradeable is + TokenRootTransferableOwnershipBase, + TokenRootBurnPausableBase, + TokenRootBurnableByRootBase, + TokenRootDisableableMintBase, + ITokenRootUpgradeable +{ + + uint256 static randomNonce_; + address static deployer_; + + TvmCell static platformCode_; + uint32 walletVersion_; + + constructor( + address initialSupplyTo, + uint128 initialSupply, + uint128 deployWalletValue, + bool mintDisabled, + bool burnByRootDisabled, + bool burnPaused, + address remainingGasTo + ) + public + { + if (msg.pubkey() != 0) { + require(msg.pubkey() == tvm.pubkey() && deployer_.value == 0, TokenErrors.WRONG_ROOT_OWNER); + tvm.accept(); + } else { + require(deployer_.value != 0 && msg.sender == deployer_ || + deployer_.value == 0 && msg.sender == rootOwner_, TokenErrors.WRONG_ROOT_OWNER); + } + + totalSupply_ = 0; + mintDisabled_ = mintDisabled; + burnByRootDisabled_ = burnByRootDisabled; + burnPaused_ = burnPaused; + walletVersion_ = 1; + + tvm.rawReserve(_targetBalance(), 0); + + if (initialSupplyTo.value != 0 && initialSupply != 0) { + TvmCell empty; + _mint(initialSupply, initialSupplyTo, deployWalletValue, remainingGasTo, false, empty); + } else if (remainingGasTo.value != 0) { + remainingGasTo.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }); + } + } + + function supportsInterface(bytes4 interfaceID) override external view responsible returns (bool) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } ( + interfaceID == bytes4(0x3204ec29) || // SID + interfaceID == bytes4(0x4371d8ed) || // TIP3TokenRoot + interfaceID == bytes4(0x0b1fd263) || // ITokenRoot + interfaceID == bytes4(0x18f7cce4) || // IBurnableByRootTokenRoot + interfaceID == bytes4(0x0095b2fa) || // IDisableableMintTokenRoot + interfaceID == bytes4(0x45c92654) || // IBurnPausableTokenRoot + interfaceID == bytes4(0x376ddffc) || // IBurnPausableTokenRoot + interfaceID == bytes4(0x1df385c6) // ITransferableOwnership + ); + } + + function walletVersion() override external view responsible returns (uint32) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } walletVersion_; + } + + function platformCode() override external view responsible returns (TvmCell) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } platformCode_; + } + + function requestUpgradeWallet( + uint32 currentVersion, + address walletOwner, + address remainingGasTo + ) + override + external + { + require(msg.sender == _getExpectedWalletAddress(walletOwner), TokenErrors.SENDER_IS_NOT_VALID_WALLET); + + tvm.rawReserve(_reserve(), 0); + + if (currentVersion == walletVersion_) { + remainingGasTo.transfer({ value: 0, flag: TokenMsgFlag.ALL_NOT_RESERVED }); + } else { + ITokenWalletUpgradeable(msg.sender).acceptUpgrade{ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED, + bounce: false + }( + walletCode_, + walletVersion_, + remainingGasTo + ); + } + } + + function setWalletCode(TvmCell code) override external onlyRootOwner { + tvm.rawReserve(_targetBalance(), 0); + walletCode_ = code; + walletVersion_++; + } + + + function upgrade(TvmCell code) override external onlyRootOwner { + TvmBuilder builder; + + builder.store(rootOwner_); + builder.store(totalSupply_); + builder.store(decimals_); + + TvmBuilder codes; + codes.store(walletVersion_); + codes.store(platformCode_); + codes.store(walletCode_); + + TvmBuilder naming; + codes.store(name_); + codes.store(symbol_); + + TvmBuilder params; + params.store(mintDisabled_); + params.store(burnByRootDisabled_); + params.store(burnPaused_); + + builder.storeRef(naming); + builder.storeRef(codes); + builder.storeRef(params); + + tvm.setcode(code); + tvm.setCurrentCode(code); + onCodeUpgrade(builder.toCell()); + } + + /* + data: + + [ address rootOwner_, uint128 totalSupply_, uint8 decimals_, + ref_1: [ uint32 walletVersion_, + ref_1_1: platformCode_, + ref_1_2: walletCode_ + ], + ref_2: [ + ref_2_1: name_, + ref_2_2: symbol_ + ], + ref_3: [ bool mintDisabled_, bool burnByRootDisabled_, bool burnPaused_] + ] + */ + function onCodeUpgrade(TvmCell data) private { } + + function _targetBalance() override internal pure returns (uint128) { + return TokenGas.TARGET_ROOT_BALANCE; + } + + function _buildWalletInitData(address walletOwner) override internal view returns (TvmCell) { + return tvm.buildStateInit({ + contr: TokenWalletPlatform, + varInit: { + root: address(this), + owner: walletOwner + }, + pubkey: 0, + code: platformCode_ + }); + } + + function _deployWallet(TvmCell initData, uint128 deployWalletValue, address remainingGasTo) + override + internal + view + returns (address) + { + address tokenWallet = new TokenWalletPlatform { + stateInit: initData, + value: deployWalletValue, + wid: address(this).wid, + flag: TokenMsgFlag.SENDER_PAYS_FEES + }(walletCode_, walletVersion_, address(0), remainingGasTo); + + return tokenWallet; + } + +} diff --git a/contracts/TIP3/TokenWallet.sol b/contracts/TIP3/TokenWallet.sol new file mode 100644 index 0000000..d41ef30 --- /dev/null +++ b/contracts/TIP3/TokenWallet.sol @@ -0,0 +1,75 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./abstract/TokenWalletBurnableByRootBase.sol"; +import "./abstract/TokenWalletBurnableBase.sol"; +import "./abstract/TokenWalletDestroyableBase.sol"; + +import "./libraries/TokenErrors.sol"; +import "./libraries/TokenGas.sol"; +import "./libraries/TokenMsgFlag.sol"; +import "./interfaces/IVersioned.sol"; + + +/* + @title Fungible token wallet contract +*/ +contract TokenWallet is + TokenWalletBurnableBase, + TokenWalletBurnableByRootBase, + TokenWalletDestroyableBase +{ + + /* + @notice Creates new token wallet + @dev All the parameters are specified as initial data + */ + constructor() public { + require(tvm.pubkey() == 0, TokenErrors.NON_ZERO_PUBLIC_KEY); + require(owner_.value != 0, TokenErrors.WRONG_WALLET_OWNER); + } + + function supportsInterface(bytes4 interfaceID) override external view responsible returns (bool) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } ( + interfaceID == bytes4(0x3204ec29) || // SID + interfaceID == bytes4(0x4f479fa3) || // TIP3TokenWallet + interfaceID == bytes4(0x2a4ac43e) || // TokenWallet + interfaceID == bytes4(0x562548ad) || // BurnableTokenWallet + interfaceID == bytes4(0x0c2ff20d) || // BurnableByRootTokenWallet + interfaceID == bytes4(0x0f0258aa) // Destroyable + ); + } + + function _targetBalance() override internal pure returns (uint128) { + return TokenGas.TARGET_WALLET_BALANCE; + } + + function _buildWalletInitData(address walletOwner) override internal view returns (TvmCell) { + return tvm.buildStateInit({ + contr: TokenWallet, + varInit: { + root_: root_, + owner_: walletOwner + }, + pubkey: 0, + code: tvm.code() + }); + } + + function _deployWallet(TvmCell initData, uint128 deployWalletValue, address) + override + internal + view + returns (address) + { + address wallet = new TokenWallet { + stateInit: initData, + value: deployWalletValue, + wid: address(this).wid, + flag: TokenMsgFlag.SENDER_PAYS_FEES + }(); + return wallet; + } +} diff --git a/contracts/TIP3/TokenWalletPlatform.sol b/contracts/TIP3/TokenWalletPlatform.sol new file mode 100644 index 0000000..981b692 --- /dev/null +++ b/contracts/TIP3/TokenWalletPlatform.sol @@ -0,0 +1,57 @@ +pragma ton-solidity >= 0.57.0; + +import "./libraries/TokenMsgFlag.sol"; + +contract TokenWalletPlatform { + address static root; + address static owner; + + constructor(TvmCell walletCode, uint32 walletVersion, address sender, address remainingGasTo) + public + functionID(0x15A038FB) + { + if (msg.sender == root || (sender.value != 0 && _getExpectedAddress(sender) == msg.sender)) { + initialize(walletCode, walletVersion, remainingGasTo); + } else { + remainingGasTo.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.DESTROY_IF_ZERO, + bounce: false + }); + } + } + + function _getExpectedAddress(address owner_) private view returns (address) { + TvmCell stateInit = tvm.buildStateInit({ + contr: TokenWalletPlatform, + varInit: { + root: root, + owner: owner_ + }, + pubkey: 0, + code: tvm.code() + }); + + return address(tvm.hash(stateInit)); + } + + function initialize(TvmCell walletCode, uint32 walletVersion, address remainingGasTo) private { + TvmBuilder builder; + + builder.store(root); + builder.store(owner); + builder.store(uint128(0)); + builder.store(uint32(0)); + builder.store(walletVersion); + builder.store(remainingGasTo); + + builder.store(tvm.code()); + + tvm.setcode(walletCode); + tvm.setCurrentCode(walletCode); + + onCodeUpgrade(builder.toCell()); + } + + function onCodeUpgrade(TvmCell data) private {} +} diff --git a/contracts/TIP3/TokenWalletUpgradeable.sol b/contracts/TIP3/TokenWalletUpgradeable.sol new file mode 100644 index 0000000..fd46a0b --- /dev/null +++ b/contracts/TIP3/TokenWalletUpgradeable.sol @@ -0,0 +1,169 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./abstract/TokenWalletBurnableByRootBase.sol"; +import "./abstract/TokenWalletBurnableBase.sol"; +import "./abstract/TokenWalletDestroyableBase.sol"; + +import "./interfaces/ITokenWalletUpgradeable.sol"; +import "./interfaces/ITokenRootUpgradeable.sol"; +import "./interfaces/IVersioned.sol"; +import "./libraries/TokenErrors.sol"; +import "./libraries/TokenGas.sol"; +import "./libraries/TokenMsgFlag.sol"; +import "./TokenWalletPlatform.sol"; + + +/* + @title Fungible token wallet contract +*/ +contract TokenWalletUpgradeable is + TokenWalletBurnableBase, + TokenWalletDestroyableBase, + TokenWalletBurnableByRootBase, + ITokenWalletUpgradeable +{ + + uint32 version_; + TvmCell platformCode_; + + constructor() public { + revert(); + } + + function supportsInterface(bytes4 interfaceID) override external view responsible returns (bool) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } ( + interfaceID == bytes4(0x3204ec29) || // SID + interfaceID == bytes4(0x4f479fa3) || // TIP3TokenWallet + interfaceID == bytes4(0x2a4ac43e) || // ITokenWallet + interfaceID == bytes4(0x562548ad) || // IBurnableTokenWallet + interfaceID == bytes4(0x0c2ff20d) || // IBurnableByRootTokenWallet + interfaceID == bytes4(0x7edc1d37) || // ITokenWalletUpgradeable + interfaceID == bytes4(0x0f0258aa) // IDestroyable + ); + } + + function platformCode() override external view responsible returns (TvmCell) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } platformCode_; + } + + /* + 0x15A038FB is TokenWalletPlatform constructor functionID + */ + function onDeployRetry(TvmCell, uint32, address sender, address remainingGasTo) + external + view + functionID(0x15A038FB) + { + require(msg.sender == root_ || address(tvm.hash(_buildWalletInitData(sender))) == msg.sender); + + tvm.rawReserve(_reserve(), 0); + + if (remainingGasTo.value != 0 && remainingGasTo != address(this)) { + remainingGasTo.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }); + } + } + + function version() override external view responsible returns (uint32) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } version_; + } + + function upgrade(address remainingGasTo) override external onlyOwner { + ITokenRootUpgradeable(root_).requestUpgradeWallet{ value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false }( + version_, + owner_, + remainingGasTo + ); + } + + function acceptUpgrade(TvmCell newCode, uint32 newVersion, address remainingGasTo) override external onlyRoot { + if (version_ == newVersion) { + tvm.rawReserve(_reserve(), 0); + remainingGasTo.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }); + } else { + TvmBuilder builder; + + builder.store(root_); + builder.store(owner_); + builder.store(balance_); + builder.store(version_); + builder.store(newVersion); + builder.store(remainingGasTo); + + builder.store(platformCode_); + + tvm.setcode(newCode); + tvm.setCurrentCode(newCode); + onCodeUpgrade(builder.toCell()); + } + } + + function onCodeUpgrade(TvmCell data) private { + tvm.rawReserve(_reserve(), 2); + tvm.resetStorage(); + + uint32 oldVersion; + address remainingGasTo; + + TvmSlice s = data.toSlice(); + (root_, owner_, balance_, oldVersion, version_, remainingGasTo) = s.decode( + address, + address, + uint128, + uint32, + uint32, + address + ); + + platformCode_ = s.loadRef(); + + if (remainingGasTo.value != 0 && remainingGasTo != address(this)) { + remainingGasTo.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }); + } + } + + function _targetBalance() override internal pure returns (uint128) { + return TokenGas.TARGET_WALLET_BALANCE; + } + + function _buildWalletInitData(address walletOwner) override internal view returns (TvmCell) { + return tvm.buildStateInit({ + contr: TokenWalletPlatform, + varInit: { + root: root_, + owner: walletOwner + }, + pubkey: 0, + code: platformCode_ + }); + } + + function _deployWallet(TvmCell initData, uint128 deployWalletValue, address remainingGasTo) + override + internal + view + returns (address) + { + address wallet = new TokenWalletPlatform { + stateInit: initData, + value: deployWalletValue, + wid: address(this).wid, + flag: TokenMsgFlag.SENDER_PAYS_FEES + }(tvm.code(), version_, owner_, remainingGasTo); + return wallet; + } +} diff --git a/contracts/TIP3/abstract/TokenRootBase.sol b/contracts/TIP3/abstract/TokenRootBase.sol new file mode 100644 index 0000000..6c3b7fc --- /dev/null +++ b/contracts/TIP3/abstract/TokenRootBase.sol @@ -0,0 +1,257 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "../interfaces/ITransferTokenRootOwnershipCallback.sol"; +import "../interfaces/IAcceptTokensBurnCallback.sol"; +import "../interfaces/ITokenRoot.sol"; +import "../interfaces/ITokenWallet.sol"; +import "../structures/ICallbackParamsStructure.sol"; +import "../libraries/TokenErrors.sol"; +import "../libraries/TokenMsgFlag.sol"; + + +/* + @title Fungible token root contract +*/ +abstract contract TokenRootBase is ITokenRoot, ICallbackParamsStructure { + + string static name_; + string static symbol_; + uint8 static decimals_; + + address static rootOwner_; + + TvmCell static walletCode_; + + uint128 totalSupply_; + + fallback() external { + } + + modifier onlyRootOwner() { + require(rootOwner_.value != 0 && rootOwner_ == msg.sender, TokenErrors.NOT_OWNER); + _; + } + + function name() override external view responsible returns (string) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } name_; + } + + function symbol() override external view responsible returns (string) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } symbol_; + } + + function decimals() override external view responsible returns (uint8) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } decimals_; + } + + function totalSupply() override external view responsible returns (uint128) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } totalSupply_; + } + + function walletCode() override external view responsible returns (TvmCell) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } walletCode_; + } + + function rootOwner() override external view responsible returns (address) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } rootOwner_; + } + + /* + @notice Derive token wallet address from the public key or address + @param walletOwner Token wallet owner address + @returns walletOwner Token wallet address + */ + function walletOf(address walletOwner) + override + public + view + responsible + returns (address) + { + require(walletOwner.value != 0, TokenErrors.WRONG_WALLET_OWNER); + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } _getExpectedWalletAddress(walletOwner); + } + + /* + @notice Deploy new token wallet with empty tokens balance + @dev Can be called by anyone to deploy new token wallet + @param walletOwner Token wallet owner address + @param deployWalletValue + */ + function deployWallet(address walletOwner, uint128 deployWalletValue) + public + override + responsible + returns (address tokenWallet) + { + require(walletOwner.value != 0, TokenErrors.WRONG_WALLET_OWNER); + tvm.rawReserve(_reserve(), 0); + + tokenWallet = _deployWallet(_buildWalletInitData(walletOwner), deployWalletValue, msg.sender); + + return { value: 0, flag: TokenMsgFlag.ALL_NOT_RESERVED, bounce: false } tokenWallet; + } + + /* + @notice Mint tokens to recipient with deploy wallet optional + @dev Can be called only by owner + @param amount How much tokens to mint + @param recipient Minted tokens owner address + @param deployWalletValue How much EVERs send to wallet on deployment, when == 0 then not deploy wallet before mint + @param remainingGasTo Receiver the remaining balance after deployment. root owner by default + @param notify - when TRUE and recipient specified 'callback' on his own TokenWallet, + then send IAcceptTokensTransferCallback.onAcceptTokensMint to specified callback address, + else this param will be ignored + @param payload - custom payload for IAcceptTokensTransferCallback.onAcceptTokensMint + */ + function mint( + uint128 amount, + address recipient, + uint128 deployWalletValue, + address remainingGasTo, + bool notify, + TvmCell payload + ) + override + external + onlyRootOwner + { + require(_mintEnabled(), TokenErrors.MINT_DISABLED); + require(amount > 0, TokenErrors.WRONG_AMOUNT); + require(recipient.value != 0, TokenErrors.WRONG_RECIPIENT); + + tvm.rawReserve(_reserve(), 0); + _mint(amount, recipient, deployWalletValue, remainingGasTo, notify, payload); + } + + /* + @notice Callback for token wallet tokens burn operation + @dev Decrease total supply + @dev Can be called only by correct token wallet contract + @dev Fails if root token is paused + @param tokens How much tokens was burned + @param sender_public_key Token wallet owner public key + @param sender_address Token wallet owner address + @param send_gas_to Remaining balance receiver + @param callback_address Callback receiver address + @param callback_payload Callback payload + */ + function acceptBurn( + uint128 amount, + address walletOwner, + address remainingGasTo, + address callbackTo, + TvmCell payload + ) + override + external + functionID(0x192B51B1) + { + require(_burnEnabled(), TokenErrors.BURN_DISABLED); + require(msg.sender == _getExpectedWalletAddress(walletOwner), TokenErrors.SENDER_IS_NOT_VALID_WALLET); + + tvm.rawReserve(address(this).balance - msg.value, 2); + + totalSupply_ -= amount; + + if (callbackTo.value == 0) { + remainingGasTo.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }); + } else { + IAcceptTokensBurnCallback(callbackTo).onAcceptTokensBurn{ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }( + amount, + walletOwner, + msg.sender, + remainingGasTo, + payload + ); + } + + } + + // =============== Support functions ================== + + function _mint( + uint128 amount, + address recipient, + uint128 deployWalletValue, + address remainingGasTo, + bool notify, + TvmCell payload + ) + internal + { + TvmCell stateInit = _buildWalletInitData(recipient); + + address recipientWallet; + + if(deployWalletValue > 0) { + recipientWallet = _deployWallet(stateInit, deployWalletValue, remainingGasTo); + } else { + recipientWallet = address(tvm.hash(stateInit)); + } + + totalSupply_ += amount; + + ITokenWallet(recipientWallet).acceptMint{ value: 0, flag: TokenMsgFlag.ALL_NOT_RESERVED, bounce: true }( + amount, + remainingGasTo, + notify, + payload + ); + } + + /* + @notice Derive wallet address from owner + @param wallet_public_key_ Token wallet owner public key + @param owner_address_ Token wallet owner address + */ + function _getExpectedWalletAddress(address walletOwner) internal view returns (address) { + return address(tvm.hash(_buildWalletInitData(walletOwner))); + } + + /* + @notice On-bounce handler + @dev Used in case token wallet .accept fails so the totalSupply_ can be decreased back + */ + onBounce(TvmSlice slice) external { + if (slice.decode(uint32) == tvm.functionId(ITokenWallet.acceptMint)) { + totalSupply_ -= slice.decode(uint128); + } + } + + /* + @notice Withdraw all surplus balance in EVERs + @dev Can by called only by owner address + @param to Withdraw receiver + */ + function sendSurplusGas(address to) external view onlyRootOwner { + tvm.rawReserve(_targetBalance(), 0); + to.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }); + } + + function _reserve() internal pure returns (uint128) { + return math.max(address(this).balance - msg.value, _targetBalance()); + } + + function _targetBalance() virtual internal pure returns (uint128); + function _mintEnabled() virtual internal view returns (bool); + function _burnEnabled() virtual internal view returns (bool); + function _buildWalletInitData(address walletOwner) virtual internal view returns (TvmCell); + function _deployWallet(TvmCell initData, uint128 deployWalletValue, address remainingGasTo) virtual internal view returns (address); + +} diff --git a/contracts/TIP3/abstract/TokenRootBurnPausableBase.sol b/contracts/TIP3/abstract/TokenRootBurnPausableBase.sol new file mode 100644 index 0000000..7d829a9 --- /dev/null +++ b/contracts/TIP3/abstract/TokenRootBurnPausableBase.sol @@ -0,0 +1,28 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./TokenRootBase.sol"; +import "../interfaces/IBurnPausableTokenRoot.sol"; +import "../libraries/TokenMsgFlag.sol"; + + +abstract contract TokenRootBurnPausableBase is TokenRootBase, IBurnPausableTokenRoot { + + bool burnPaused_; + + function burnPaused() override external view responsible returns (bool) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } burnPaused_; + } + + function setBurnPaused(bool paused) override external responsible onlyRootOwner returns (bool) { + burnPaused_ = paused; + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } burnPaused_; + } + + function _burnEnabled() override internal view returns (bool) { + return !burnPaused_; + } + +} diff --git a/contracts/TIP3/abstract/TokenRootBurnableByRootBase.sol b/contracts/TIP3/abstract/TokenRootBurnableByRootBase.sol new file mode 100644 index 0000000..6cfdef5 --- /dev/null +++ b/contracts/TIP3/abstract/TokenRootBurnableByRootBase.sol @@ -0,0 +1,63 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./TokenRootBase.sol"; +import "../interfaces/IBurnableByRootTokenRoot.sol"; +import "../interfaces/IBurnableByRootTokenWallet.sol"; +import "../libraries/TokenErrors.sol"; +import "../libraries/TokenMsgFlag.sol"; + + +abstract contract TokenRootBurnableByRootBase is TokenRootBase, IBurnableByRootTokenRoot { + + bool burnByRootDisabled_; + + /* + @notice Burn tokens at specific token wallet + @dev Can be called only by owner address + @dev Don't support token wallet owner public key + @param amount How much tokens to burn + @param owner Token wallet owner address + @param send_gas_to Receiver of the remaining balance after burn. sender_address by default + @param callback_address Burn callback address + @param callback_payload Burn callback payload + */ + function burnTokens( + uint128 amount, + address walletOwner, + address remainingGasTo, + address callbackTo, + TvmCell payload + ) + override + external + onlyRootOwner + { + require(!burnByRootDisabled_, TokenErrors.BURN_BY_ROOT_DISABLED); + require(amount > 0, TokenErrors.WRONG_AMOUNT); + require(walletOwner.value != 0, TokenErrors.WRONG_WALLET_OWNER); + + IBurnableByRootTokenWallet(_getExpectedWalletAddress(walletOwner)).burnByRoot{ + value: 0, + bounce: true, + flag: TokenMsgFlag.REMAINING_GAS + }( + amount, + remainingGasTo, + callbackTo, + payload + ); + } + + function disableBurnByRoot() override external responsible onlyRootOwner returns (bool) { + burnByRootDisabled_ = true; + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } burnByRootDisabled_; + } + + function burnByRootDisabled() override external view responsible returns (bool) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } burnByRootDisabled_; + } + +} diff --git a/contracts/TIP3/abstract/TokenRootDisableableMintBase.sol b/contracts/TIP3/abstract/TokenRootDisableableMintBase.sol new file mode 100644 index 0000000..e04cc61 --- /dev/null +++ b/contracts/TIP3/abstract/TokenRootDisableableMintBase.sol @@ -0,0 +1,29 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./TokenRootBase.sol"; +import "../interfaces/IDisableableMintTokenRoot.sol"; +import "../libraries/TokenErrors.sol"; +import "../libraries/TokenMsgFlag.sol"; + + +abstract contract TokenRootDisableableMintBase is TokenRootBase, IDisableableMintTokenRoot { + + bool mintDisabled_; + + function disableMint() override external responsible onlyRootOwner returns (bool) { + mintDisabled_ = true; + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } mintDisabled_; + } + + function mintDisabled() override external view responsible returns (bool) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } mintDisabled_; + } + + function _mintEnabled() override internal view returns (bool) { + return !mintDisabled_; + } + +} diff --git a/contracts/TIP3/abstract/TokenRootTransferableOwnershipBase.sol b/contracts/TIP3/abstract/TokenRootTransferableOwnershipBase.sol new file mode 100644 index 0000000..5b64a1c --- /dev/null +++ b/contracts/TIP3/abstract/TokenRootTransferableOwnershipBase.sol @@ -0,0 +1,57 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./TokenRootBase.sol"; +import "../interfaces/ITransferableOwnership.sol"; + + +abstract contract TokenRootTransferableOwnershipBase is TokenRootBase, ITransferableOwnership { + + function transferOwnership( + address newOwner, + address remainingGasTo, + mapping(address => CallbackParams) callbacks + ) + override + external + onlyRootOwner + { + tvm.rawReserve(_reserve(), 0); + + address oldOwner = rootOwner_; + rootOwner_ = newOwner; + + optional(TvmCell) callbackToGasOwner; + for ((address dest, CallbackParams p) : callbacks) { + if (dest.value != 0) { + if (remainingGasTo != dest) { + ITransferTokenRootOwnershipCallback(dest).onTransferTokenRootOwnership{ + value: p.value, + flag: TokenMsgFlag.SENDER_PAYS_FEES, + bounce: false + }(oldOwner, rootOwner_, remainingGasTo, p.payload); + } else { + callbackToGasOwner.set(p.payload); + } + } + } + + if (remainingGasTo.value != 0) { + if (callbackToGasOwner.hasValue()) { + ITransferTokenRootOwnershipCallback(remainingGasTo).onTransferTokenRootOwnership{ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED, + bounce: false + }(oldOwner, rootOwner_, remainingGasTo, callbackToGasOwner.get()); + } else { + remainingGasTo.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }); + } + } + } +} diff --git a/contracts/TIP3/abstract/TokenWalletBase.sol b/contracts/TIP3/abstract/TokenWalletBase.sol new file mode 100644 index 0000000..d01a82c --- /dev/null +++ b/contracts/TIP3/abstract/TokenWalletBase.sol @@ -0,0 +1,281 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "../interfaces/ITokenWallet.sol"; +import "../interfaces/ITokenRoot.sol"; +import "../interfaces/IAcceptTokensTransferCallback.sol"; +import "../interfaces/IAcceptTokensMintCallback.sol"; +import "../interfaces/IBounceTokensTransferCallback.sol"; +import "../interfaces/IBounceTokensBurnCallback.sol"; +import "../libraries/TokenErrors.sol"; +import "../libraries/TokenMsgFlag.sol"; + + +abstract contract TokenWalletBase is ITokenWallet { + + address static root_; + address static owner_; + + uint128 balance_; + + modifier onlyRoot() { + require(root_ == msg.sender, TokenErrors.NOT_ROOT); + _; + } + + modifier onlyOwner() { + require(owner_ == msg.sender, TokenErrors.NOT_OWNER); + _; + } + + function balance() override external view responsible returns (uint128) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } balance_; + } + + function owner() override external view responsible returns (address) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } owner_; + } + + function root() override external view responsible returns (address) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } root_; + } + + function walletCode() override external view responsible returns (TvmCell) { + return { value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false } tvm.code(); + } + + function transfer( + uint128 amount, + address recipient, + uint128 deployWalletValue, + address remainingGasTo, + bool notify, + TvmCell payload + ) + override + external + onlyOwner + { + require(amount > 0, TokenErrors.WRONG_AMOUNT); + require(amount <= balance_, TokenErrors.NOT_ENOUGH_BALANCE); + require(recipient.value != 0 && recipient != owner_, TokenErrors.WRONG_RECIPIENT); + + tvm.rawReserve(_reserve(), 0); + + TvmCell stateInit = _buildWalletInitData(recipient); + + address recipientWallet; + + if (deployWalletValue > 0) { + recipientWallet = _deployWallet(stateInit, deployWalletValue, remainingGasTo); + } else { + recipientWallet = address(tvm.hash(stateInit)); + } + + balance_ -= amount; + + ITokenWallet(recipientWallet).acceptTransfer{ value: 0, flag: TokenMsgFlag.ALL_NOT_RESERVED, bounce: true }( + amount, + owner_, + remainingGasTo, + notify, + payload + ); + } + + /* + @notice Transfer tokens using another TokenWallet address, that wallet must be deployed previously + @dev Can be called only by token wallet owner + @param amount How much tokens to transfer + @param recipientWallet Recipient TokenWallet address + @param remainingGasTo Remaining gas receiver + @param notify Notify receiver on incoming transfer + @param payload Notification payload + */ + function transferToWallet( + uint128 amount, + address recipientTokenWallet, + address remainingGasTo, + bool notify, + TvmCell payload + ) + override + external + onlyOwner + { + require(amount > 0, TokenErrors.WRONG_AMOUNT); + require(amount <= balance_, TokenErrors.NOT_ENOUGH_BALANCE); + require(recipientTokenWallet.value != 0 && recipientTokenWallet != address(this), TokenErrors.WRONG_RECIPIENT); + + tvm.rawReserve(_reserve(), 0); + + balance_ -= amount; + + ITokenWallet(recipientTokenWallet).acceptTransfer{ value: 0, flag: TokenMsgFlag.ALL_NOT_RESERVED, bounce: true }( + amount, + owner_, + remainingGasTo, + notify, + payload + ); + } + + /* + @notice Callback for transfer operation + @dev Can be called only by another valid TokenWallet contract with same root + @param amount How much tokens to receive + @param sender Sender address + @param remainingGasTo Remaining gas receiver + @param notify Notify receiver on incoming transfer + @param payload Notification payload + */ + function acceptTransfer( + uint128 amount, + address sender, + address remainingGasTo, + bool notify, + TvmCell payload + ) + override + external + functionID(0x67A0B95F) + { + require(msg.sender == address(tvm.hash(_buildWalletInitData(sender))), TokenErrors.SENDER_IS_NOT_VALID_WALLET); + + tvm.rawReserve(_reserve(), 2); + + balance_ += amount; + + if (notify) { + IAcceptTokensTransferCallback(owner_).onAcceptTokensTransfer{ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }( + root_, + amount, + sender, + msg.sender, + remainingGasTo, + payload + ); + } else { + remainingGasTo.transfer({ value: 0, flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, bounce: false }); + } + } + + /* + @notice Accept minted tokens from root + @dev Can be called only by root token + @param amount How much tokens to accept + @param data Additional data + */ + function acceptMint(uint128 amount, address remainingGasTo, bool notify, TvmCell payload) + override + external + functionID(0x4384F298) + onlyRoot + { + tvm.rawReserve(_reserve(), 2); + + balance_ += amount; + + if (notify) { + IAcceptTokensMintCallback(owner_).onAcceptTokensMint{ + value: 0, + bounce: false, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS + }( + root_, + amount, + remainingGasTo, + payload + ); + } else if (remainingGasTo.value != 0 && remainingGasTo != address(this)) { + remainingGasTo.transfer({ value: 0, flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, bounce: false }); + } + } + + /* + @notice On-bounce handler + @dev Catch bounce if acceptTransfer or tokensBurned fails + @dev If transfer fails - increase back tokens balance and notify owner + @dev If tokens burn root token callback fails - increase back tokens balance and notify owner + */ + onBounce(TvmSlice body) external { + tvm.rawReserve(_reserve(), 2); + + uint32 functionId = body.decode(uint32); + + if (functionId == tvm.functionId(ITokenWallet.acceptTransfer)) { + uint128 amount = body.decode(uint128); + balance_ += amount; + IBounceTokensTransferCallback(owner_).onBounceTokensTransfer{ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }( + root_, + amount, + msg.sender + ); + } else if (functionId == tvm.functionId(ITokenRoot.acceptBurn)) { + uint128 amount = body.decode(uint128); + balance_ += amount; + IBounceTokensBurnCallback(owner_).onBounceTokensBurn{ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }( + root_, + amount + ); + } + } + + function _burn( + uint128 amount, + address remainingGasTo, + address callbackTo, + TvmCell payload + ) internal { + require(amount > 0, TokenErrors.WRONG_AMOUNT); + require(amount <= balance_, TokenErrors.NOT_ENOUGH_BALANCE); + + tvm.rawReserve(_reserve(), 0); + + balance_ -= amount; + + ITokenRoot(root_).acceptBurn{ value: 0, flag: TokenMsgFlag.ALL_NOT_RESERVED, bounce: true }( + amount, + owner_, + remainingGasTo, + callbackTo, + payload + ); + } + + /* + @notice Withdraw all surplus balance in EVERs + @dev Can by called only by owner address + @param to Withdraw receiver + */ + function sendSurplusGas(address to) external view onlyOwner { + tvm.rawReserve(_targetBalance(), 0); + to.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.IGNORE_ERRORS, + bounce: false + }); + } + + function _reserve() internal pure returns (uint128) { + return math.max(address(this).balance - msg.value, _targetBalance()); + } + + function _targetBalance() virtual internal pure returns (uint128); + function _buildWalletInitData(address walletOwner) virtual internal view returns (TvmCell); + function _deployWallet(TvmCell initData, uint128 deployWalletValue, address remainingGasTo) virtual internal view returns (address); +} diff --git a/contracts/TIP3/abstract/TokenWalletBurnableBase.sol b/contracts/TIP3/abstract/TokenWalletBurnableBase.sol new file mode 100644 index 0000000..aa84744 --- /dev/null +++ b/contracts/TIP3/abstract/TokenWalletBurnableBase.sol @@ -0,0 +1,32 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./TokenWalletBase.sol"; +import "../interfaces/ITokenRoot.sol"; +import "../interfaces/IBurnableTokenWallet.sol"; +import "../libraries/TokenErrors.sol"; +import "../libraries/TokenMsgFlag.sol"; + + +abstract contract TokenWalletBurnableBase is TokenWalletBase, IBurnableTokenWallet { + + /* + @notice Burn tokens + @dev Can be called only by token wallet owner + @param tokens How much tokens to burn + @param grams How much EVERs attach to tokensBurned in case called with owner public key + @param remainingGasTo Receiver of the remaining EVERs balance, used in tokensBurned callback + @param callbackTo Address of contract, which implement IAcceptTokensBurnCallback.onAcceptTokensBurn + if it equals to 0:0 then no callbacks + @param payload Custom data will be delivered into IAcceptTokensBurnCallback.onAcceptTokensBurn + */ + function burn(uint128 amount, address remainingGasTo, address callbackTo, TvmCell payload) + override + external + onlyOwner + { + _burn(amount, remainingGasTo, callbackTo, payload); + } +} diff --git a/contracts/TIP3/abstract/TokenWalletBurnableByRootBase.sol b/contracts/TIP3/abstract/TokenWalletBurnableByRootBase.sol new file mode 100644 index 0000000..876e78e --- /dev/null +++ b/contracts/TIP3/abstract/TokenWalletBurnableByRootBase.sol @@ -0,0 +1,29 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./TokenWalletBase.sol"; +import "../interfaces/IBurnableByRootTokenWallet.sol"; + + +abstract contract TokenWalletBurnableByRootBase is TokenWalletBase, IBurnableByRootTokenWallet { + + /* + @notice Allows for rootOwner burn tokens from TokenWallet + @dev Can be called only by TokenRoot + @param amount Amount tokens to burn + @param remainingGasTo Receiver of the remaining EVERs + @param callbackTo address of contract, which implement IAcceptTokensBurnCallback.onAcceptTokensBurn + if it equals to 0:0 then no callbacks + @param payload Custom data will be delivered into IAcceptTokensBurnCallback.onAcceptTokensBurn + */ + function burnByRoot(uint128 amount, address remainingGasTo, address callbackTo, TvmCell payload) + override + external + onlyRoot + { + _burn(amount, remainingGasTo, callbackTo, payload); + } + +} diff --git a/contracts/TIP3/abstract/TokenWalletDestroyableBase.sol b/contracts/TIP3/abstract/TokenWalletDestroyableBase.sol new file mode 100644 index 0000000..76b119a --- /dev/null +++ b/contracts/TIP3/abstract/TokenWalletDestroyableBase.sol @@ -0,0 +1,23 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "./TokenWalletBase.sol"; +import "../interfaces/ITokenRoot.sol"; +import "../interfaces/IDestroyable.sol"; +import "../libraries/TokenErrors.sol"; +import "../libraries/TokenMsgFlag.sol"; + + +abstract contract TokenWalletDestroyableBase is TokenWalletBase, IDestroyable { + + function destroy(address remainingGasTo) override external onlyOwner { + require(balance_ == 0, TokenErrors.NON_EMPTY_BALANCE); + remainingGasTo.transfer({ + value: 0, + flag: TokenMsgFlag.ALL_NOT_RESERVED + TokenMsgFlag.DESTROY_IF_ZERO, + bounce: false + }); + } +} diff --git a/contracts/TIP3/additional/Selector.sol b/contracts/TIP3/additional/Selector.sol new file mode 100644 index 0000000..92097f3 --- /dev/null +++ b/contracts/TIP3/additional/Selector.sol @@ -0,0 +1,177 @@ +pragma ton-solidity >= 0.57.0; + +import "../interfaces/SID.sol"; +import "../interfaces/TIP3TokenWallet.sol"; +import "../interfaces/TIP3TokenRoot.sol"; +import "../interfaces/ITokenRoot.sol"; +import "../interfaces/ITransferableOwnership.sol"; +import "../interfaces/ITokenWallet.sol"; +import "../interfaces/IBurnableTokenWallet.sol"; +import "../interfaces/IBurnableByRootTokenRoot.sol"; +import "../interfaces/IBurnableByRootTokenWallet.sol"; +import "../interfaces/IDestroyable.sol"; +import "../interfaces/IVersioned.sol"; +import "../interfaces/IDisableableMintTokenRoot.sol"; +import "../interfaces/ITokenWalletUpgradeable.sol"; +import "../interfaces/ITokenRootUpgradeable.sol"; +import "../interfaces/IBurnPausableTokenRoot.sol"; + +interface TIP3 { + function acceptBurn(uint128 _value) external; + function acceptTransfer(uint128 _value) external; + function acceptMint(uint128 _value) external; +} + +contract Selector { + uint static _randomNonce; + + constructor() public { + tvm.accept(); + } + + function calculateAcceptTransferSelector() public pure returns (bytes4) { + TIP3 i; + return bytes4(tvm.functionId(i.acceptTransfer) - 1); + } + + function calculateAcceptMintSelector() public pure returns (bytes4) { + TIP3 i; + return bytes4(tvm.functionId(i.acceptMint) - 1); + } + + function calculateAcceptBurnSelector() public pure returns (bytes4) { + TIP3 i; + return bytes4(tvm.functionId(i.acceptBurn) - 1); + } + + function calculateTIP3TokenRootInterfaceID() public pure returns (bytes4) { + TIP3TokenRoot i; + + return bytes4( + tvm.functionId(i.name) ^ + tvm.functionId(i.symbol) ^ + tvm.functionId(i.decimals) ^ + tvm.functionId(i.totalSupply) ^ + tvm.functionId(i.walletCode) ^ uint32(calculateAcceptBurnSelector()) + ); + } + + function calculateTIP3TokenWalletInterfaceID() public pure returns(bytes4) { + TIP3TokenWallet i; + + return bytes4( + tvm.functionId(i.root) ^ + tvm.functionId(i.balance) ^ + tvm.functionId(i.walletCode) ^ uint32(calculateAcceptTransferSelector()) ^ uint32(calculateAcceptMintSelector()) + ); + } + + function calculateSIDInterfaceID() public pure returns(bytes4) { + SID i; + + return bytes4(tvm.functionId(i.supportsInterface)); + } + + function calculateVersionedInterfaceID() public pure returns(bytes4) { + IVersioned i; + + return bytes4(tvm.functionId(i.version)); + } + + function calculateTokenRootInterfaceID() public pure returns (bytes4) { + ITokenRoot i; + + return bytes4( + tvm.functionId(i.rootOwner) ^ + tvm.functionId(i.walletOf) ^ + tvm.functionId(i.mint) ^ + tvm.functionId(i.deployWallet) + ); + } + + function calculateTokenWalletInterfaceID() public pure returns (bytes4) { + ITokenWallet i; + + return bytes4( + tvm.functionId(i.owner) ^ + tvm.functionId(i.transfer) ^ + tvm.functionId(i.transferToWallet) + ); + } + + function calculateBurnableTokenWalletInterfaceID() public pure returns (bytes4) { + IBurnableTokenWallet i; + + return bytes4(tvm.functionId(i.burn)); + } + + function calculateBurnableByRootTokenRootInterfaceID() public pure returns (bytes4) { + IBurnableByRootTokenRoot i; + + return bytes4( + tvm.functionId(i.burnTokens) ^ + tvm.functionId(i.disableBurnByRoot) ^ + tvm.functionId(i.burnByRootDisabled) + ); + } + + function calculateBurnableByRootTokenWalletInterfaceID() public pure returns (bytes4) { + IBurnableByRootTokenWallet i; + + return bytes4(tvm.functionId(i.burnByRoot)); + } + + function calculateDestroyableInterfaceID() public pure returns (bytes4) { + IDestroyable i; + + return bytes4(tvm.functionId(i.destroy)); + } + + function calculateDisableableMintTokenRootInterfaceID() public pure returns (bytes4) { + IDisableableMintTokenRoot i; + + return bytes4( + tvm.functionId(i.disableMint) ^ + tvm.functionId(i.mintDisabled) + ); + } + + function calculateTransferableOwnershipInterfaceID() public pure returns (bytes4) { + ITransferableOwnership i; + + return bytes4( + tvm.functionId(i.transferOwnership) + ); + } + + function calculateBurnPausableTokenRootInterfaceID() public pure returns (bytes4) { + IBurnPausableTokenRoot i; + + return bytes4( + tvm.functionId(i.setBurnPaused) ^ + tvm.functionId(i.burnPaused) + ); + } + + function calculateTokenWalletUpgradeableInterfaceID() public pure returns (bytes4) { + ITokenWalletUpgradeable i; + + return bytes4( + tvm.functionId(i.platformCode) ^ + tvm.functionId(i.upgrade) ^ + tvm.functionId(i.acceptUpgrade) + ); + } + + function calculateTokenRootUpgradeableInterfaceID() public pure returns (bytes4) { + ITokenRootUpgradeable i; + + return bytes4( + tvm.functionId(i.walletVersion) ^ + tvm.functionId(i.platformCode) ^ + tvm.functionId(i.requestUpgradeWallet) ^ + tvm.functionId(i.setWalletCode) ^ + tvm.functionId(i.upgrade) + ); + } +} diff --git a/contracts/TIP3/additional/TokenFactory.sol b/contracts/TIP3/additional/TokenFactory.sol new file mode 100644 index 0000000..b6ff33a --- /dev/null +++ b/contracts/TIP3/additional/TokenFactory.sol @@ -0,0 +1,221 @@ +pragma ton-solidity >= 0.57.0; + +pragma AbiHeader expire; +pragma AbiHeader pubkey; + +import "../interfaces/ITokenFactory.sol"; +import "../libraries/TokenErrors.sol"; +import "../libraries/TokenMsgFlag.sol"; +import "../TokenRoot.sol"; +import "../TokenRootUpgradeable.sol"; + + +contract TokenFactory is ITokenFactory { + + event RootDeployed(address root); + + uint256 static _randomNonce; + + address public _owner; + address public _pendingOwner; + uint256 public _tokenNonce; + uint128 public _deployValue; + + TvmCell public _rootCode; + TvmCell public _walletCode; + + TvmCell public _rootUpgradeableCode; + TvmCell public _walletUpgradeableCode; + TvmCell public _platformCode; + + + modifier onlyOwner { + require(msg.sender == _owner && _owner.value != 0, TokenErrors.NOT_OWNER); + _; + } + + modifier cashBack { + _; + msg.sender.transfer({value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false}); + } + + + constructor( + address owner, + uint128 deployValue, + TvmCell rootCode, + TvmCell walletCode, + TvmCell rootUpgradeableCode, + TvmCell walletUpgradeableCode, + TvmCell platformCode + ) public { + tvm.accept(); + _owner = owner; + _deployValue = deployValue; + _rootCode = rootCode; + _walletCode = walletCode; + _rootUpgradeableCode = rootUpgradeableCode; + _walletUpgradeableCode = walletUpgradeableCode; + _platformCode = platformCode; + } + + + function deployRoot( + string name, + string symbol, + uint8 decimals, + address owner, + address initialSupplyTo, + uint128 initialSupply, + uint128 deployWalletValue, + bool mintDisabled, + bool burnByRootDisabled, + bool burnPaused, + address remainingGasTo, + bool upgradeable + ) public responsible virtual override returns (address) { + tvm.rawReserve(address(this).balance - msg.value, 0); + + function (uint256, string, string, uint8, address) returns (TvmCell) buildStateInit = + upgradeable ? _buildUpgradeableStateInit : _buildCommonStateInit; + + TvmCell stateInit = buildStateInit(_tokenNonce++, name, symbol, decimals, owner); + // constructors of `TokenRoot` and `TokenRootUpgradeable` have the same signatures and the same functionID + // so use `new TokenRoot` for both roots + address root = new TokenRoot { + value: _deployValue, + flag: TokenMsgFlag.SENDER_PAYS_FEES, + bounce: false, + stateInit: stateInit + }( + initialSupplyTo, + initialSupply, + deployWalletValue, + mintDisabled, + burnByRootDisabled, + burnPaused, + remainingGasTo + ); + emit RootDeployed(root); + return {value: 0, flag: 128, bounce: false} root; + } + + function _buildCommonStateInit( + uint256 nonce, + string name, + string symbol, + uint8 decimals, + address owner + ) internal view returns (TvmCell) { + return tvm.buildStateInit({ + contr: TokenRoot, + varInit: { + randomNonce_: nonce, + deployer_: address(this), + name_: name, + symbol_: symbol, + decimals_: decimals, + rootOwner_: owner, + walletCode_: _walletCode + }, + code: _rootCode, + pubkey: 0 + }); + } + + function _buildUpgradeableStateInit( + uint256 nonce, + string name, + string symbol, + uint8 decimals, + address owner + ) internal view returns (TvmCell) { + return tvm.buildStateInit({ + contr: TokenRootUpgradeable, + varInit: { + randomNonce_: nonce, + deployer_: address(this), + name_: name, + symbol_: symbol, + decimals_: decimals, + rootOwner_: owner, + walletCode_: _walletUpgradeableCode, + platformCode_: _platformCode + }, + code: _rootUpgradeableCode, + pubkey: 0 + }); + } + + function changeDeployValue(uint128 deployValue) public onlyOwner cashBack { + _deployValue = deployValue; + } + + function changeRootCode(TvmCell rootCode) public onlyOwner cashBack { + _rootCode = rootCode; + } + + function changeWalletCode(TvmCell walletCode) public onlyOwner cashBack { + _walletCode = walletCode; + } + + function changeRootUpgradeableCode(TvmCell rootUpgradeableCode) public onlyOwner cashBack { + _rootUpgradeableCode = rootUpgradeableCode; + } + + function changeWalletUpgradeableCode(TvmCell walletUpgradeableCode) public onlyOwner cashBack { + _walletUpgradeableCode = walletUpgradeableCode; + } + + function changePlatformCode(TvmCell platformCode) public onlyOwner cashBack { + _platformCode = platformCode; + } + + function transferOwner(address owner) public onlyOwner cashBack { + _pendingOwner = owner; + } + + function acceptOwner() public cashBack { + require(msg.sender == _pendingOwner && _pendingOwner.value != 0, TokenErrors.NOT_OWNER); + _owner = _pendingOwner; + _pendingOwner = address(0); + } + + function upgrade(TvmCell code) public onlyOwner { + TvmBuilder common; + common.store(_rootCode); + common.store(_walletCode); + + TvmBuilder upgradeable; + upgradeable.store(_rootUpgradeableCode); + upgradeable.store(_walletUpgradeableCode); + upgradeable.store(_platformCode); + + TvmBuilder builder; + builder.store(_owner); + builder.store(_pendingOwner); + builder.store(_tokenNonce); + builder.store(_deployValue); + builder.storeRef(common); + builder.storeRef(upgradeable); + + tvm.setcode(code); + tvm.setCurrentCode(code); + onCodeUpgrade(builder.toCell()); + } + + function onCodeUpgrade(TvmCell data) private { + tvm.resetStorage(); + TvmSlice slice = data.toSlice(); + (_owner, _pendingOwner, _tokenNonce, _deployValue) = slice.decode(address, address, uint256, uint128); + + TvmSlice common = slice.loadRefAsSlice(); + _rootCode = common.loadRef(); + _walletCode = common.loadRef(); + + TvmSlice upgradeable = slice.loadRefAsSlice(); + _rootUpgradeableCode = upgradeable.loadRef(); + _walletUpgradeableCode = upgradeable.loadRef(); + _platformCode = upgradeable.loadRef(); + } +} diff --git a/contracts/TIP3/additional/Wallet.sol b/contracts/TIP3/additional/Wallet.sol new file mode 100644 index 0000000..c8d7a41 --- /dev/null +++ b/contracts/TIP3/additional/Wallet.sol @@ -0,0 +1,5 @@ +pragma ton-solidity >= 0.57.0; + +import '@broxus/contracts/contracts/wallets/Account.sol'; + +contract Wallet is Account {} diff --git a/contracts/TIP3/interfaces/IAcceptTokensBurnCallback.sol b/contracts/TIP3/interfaces/IAcceptTokensBurnCallback.sol new file mode 100644 index 0000000..128d344 --- /dev/null +++ b/contracts/TIP3/interfaces/IAcceptTokensBurnCallback.sol @@ -0,0 +1,33 @@ +pragma ton-solidity >= 0.57.0; + +/* + +1) +walletOwner -> IBurnableTokenWallet(wallet).burn(...) -> + IBurnPausableTokenRoot(root).tokensBurned(...) -> + IAcceptTokensBurnCallback(callbackTo).onAcceptTokensBurn(...) -> ... +2) +rootOwner -> IBurnableByRootTokenRoot(root).burnTokens(...) -> + IBurnableByRootTokenWallet(wallet).burnByRoot(...) -> + IBurnPausableTokenRoot(root).tokensBurned(...) -> + IAcceptTokensBurnCallback(callbackTo).onAcceptTokensBurn(...) -> ... +*/ + + +interface IAcceptTokensBurnCallback { + + /* + @notice Callback from TokenRoot on tokens burned + @param amount How much tokens was burned + @param walletOwner Burner TokenWallet owner address + @param remainingGasTo Receiver of the remaining EVERs + @param payload - Custom data specified in IBurnableTokenWallet.burn or IBurnableByRootTokenRoot.burnTokens + */ + function onAcceptTokensBurn( + uint128 amount, + address walletOwner, + address wallet, + address remainingGasTo, + TvmCell payload + ) external; +} diff --git a/contracts/TIP3/interfaces/IAcceptTokensMintCallback.sol b/contracts/TIP3/interfaces/IAcceptTokensMintCallback.sol new file mode 100644 index 0000000..0adee38 --- /dev/null +++ b/contracts/TIP3/interfaces/IAcceptTokensMintCallback.sol @@ -0,0 +1,21 @@ +pragma ton-solidity >= 0.57.0; + + +interface IAcceptTokensMintCallback { + + /* + @notice Callback from TokenWallet on accept minted tokens + @param tokenRoot TokenRoot of received tokens + @param amount Minted tokens amount + @param remainingGasTo Address specified for receive remaining gas + @param payload Additional data attached to mint + */ + function onAcceptTokensMint( + address tokenRoot, + uint128 amount, + address remainingGasTo, + TvmCell payload + ) external; + + +} diff --git a/contracts/TIP3/interfaces/IAcceptTokensTransferCallback.sol b/contracts/TIP3/interfaces/IAcceptTokensTransferCallback.sol new file mode 100644 index 0000000..96bc916 --- /dev/null +++ b/contracts/TIP3/interfaces/IAcceptTokensTransferCallback.sol @@ -0,0 +1,30 @@ +pragma ton-solidity >= 0.57.0; + +/* + Callbacks from TokenWallet. +*/ + + +interface IAcceptTokensTransferCallback { + + /* + @notice Callback from TokenWallet on receive tokens transfer + @param tokenWallet TokenWallet for which tokens were received + @param tokenRoot TokenRoot of received tokens + @param amount Received tokens amount + @param sender Sender TokenWallet owner address + @param senderWallet Sender TokenWallet address + @param remainingGasTo Address specified for receive remaining gas + @param payload Additional data attached to transfer by sender + */ + function onAcceptTokensTransfer( + address tokenRoot, + uint128 amount, + address sender, + address senderWallet, + address remainingGasTo, + TvmCell payload + ) external; + + +} diff --git a/contracts/TIP3/interfaces/IBounceTokensBurnCallback.sol b/contracts/TIP3/interfaces/IBounceTokensBurnCallback.sol new file mode 100644 index 0000000..8ec3746 --- /dev/null +++ b/contracts/TIP3/interfaces/IBounceTokensBurnCallback.sol @@ -0,0 +1,17 @@ +pragma ton-solidity >= 0.57.0; + + +interface IBounceTokensBurnCallback { + + /* + @notice Callback from TokenWallet on tokens burn reverted + @param tokenRoot TokenRoot of received tokens + @param amount Reverted tokens amount + */ + function onBounceTokensBurn( + address tokenRoot, + uint128 amount + ) external; + + +} diff --git a/contracts/TIP3/interfaces/IBounceTokensTransferCallback.sol b/contracts/TIP3/interfaces/IBounceTokensTransferCallback.sol new file mode 100644 index 0000000..f7c52d0 --- /dev/null +++ b/contracts/TIP3/interfaces/IBounceTokensTransferCallback.sol @@ -0,0 +1,20 @@ +pragma ton-solidity >= 0.57.0; + + +interface IBounceTokensTransferCallback { + + /* + @notice Callback from TokenWallet when tokens transfer reverted + @param tokenWallet TokenWallet for which tokens were received + @param tokenRoot TokenRoot of received tokens + @param amount Reverted tokens amount + @param revertedFrom Address which declained acceptTransfer + */ + function onBounceTokensTransfer( + address tokenRoot, + uint128 amount, + address revertedFrom + ) external; + + +} diff --git a/contracts/TIP3/interfaces/IBurnPausableTokenRoot.sol b/contracts/TIP3/interfaces/IBurnPausableTokenRoot.sol new file mode 100644 index 0000000..15e99de --- /dev/null +++ b/contracts/TIP3/interfaces/IBurnPausableTokenRoot.sol @@ -0,0 +1,20 @@ +pragma ton-solidity >= 0.57.0; +pragma AbiHeader expire; + +interface IBurnPausableTokenRoot { + + /* + @notice Pause/Unpause token burns + @dev Can be called only by rootOwner + @dev if paused, then all burned tokens will be bounced to TokenWallet + @param paused + @returns paused + */ + function setBurnPaused(bool paused) external responsible returns (bool); + + /* + @notice Get burn paused status + @returns paused + */ + function burnPaused() external view responsible returns (bool); +} diff --git a/contracts/TIP3/interfaces/IBurnableByRootTokenRoot.sol b/contracts/TIP3/interfaces/IBurnableByRootTokenRoot.sol new file mode 100644 index 0000000..0a27ee0 --- /dev/null +++ b/contracts/TIP3/interfaces/IBurnableByRootTokenRoot.sol @@ -0,0 +1,45 @@ +pragma ton-solidity >= 0.57.0; + +import "./IBurnPausableTokenRoot.sol"; + +/* +rootOwner -> IBurnableByRootTokenRoot(root).burnTokens(...) -> + IBurnableByRootTokenWallet(wallet).burnByRoot(...) -> + ITokenRoot(root).acceptBurn(...) -> + IAcceptTokensBurnCallback(callbackTo).onAcceptTokensBurn(...) -> ... +*/ + + +interface IBurnableByRootTokenRoot { + + /* + @notice Allows for rootOwner burn tokens from any TokenWallet + @dev This method can be disabled using `disableBurnByRoot()` + @dev Can be called only by rootOwner + @param amount Amount tokens to burn + @param walletOwner TokenWallet owner address + @param remainingGasTo Receiver of the remaining EVERs + @param callbackTo address of contract, which implement IAcceptTokensBurnCallback.onAcceptTokensBurn + if it equals to 0:0 then no callbacks + @param payload Custom data will be delivered into IAcceptTokensBurnCallback.onAcceptTokensBurn + */ + function burnTokens( + uint128 amount, + address walletOwner, + address remainingGasTo, + address callbackTo, + TvmCell payload + ) external; + + + /* + @notice Allows to disable `burnTokens` method forever + @dev Can be called only by rootOwner + */ + function disableBurnByRoot() external responsible returns (bool); + + /* + @notice Get `burnTokens` disabled status + */ + function burnByRootDisabled() external view responsible returns (bool); +} diff --git a/contracts/TIP3/interfaces/IBurnableByRootTokenWallet.sol b/contracts/TIP3/interfaces/IBurnableByRootTokenWallet.sol new file mode 100644 index 0000000..8fbbac0 --- /dev/null +++ b/contracts/TIP3/interfaces/IBurnableByRootTokenWallet.sol @@ -0,0 +1,27 @@ +pragma ton-solidity >= 0.57.0; + +/* +rootOwner -> IBurnableByRootTokenRoot(root).burnTokens(...) -> + IBurnableByRootTokenWallet(wallet).burnByRoot(...) -> + IBurnPausableTokenRoot(root).tokensBurned(...) -> + IAcceptTokensBurnCallback(callbackTo).onAcceptTokensBurn(...) -> ... +*/ + +interface IBurnableByRootTokenWallet { + + /* + @notice Allows for rootOwner burn tokens from TokenWallet + @dev Can be called only by TokenRoot + @param amount Amount tokens to burn + @param remainingGasTo Receiver of the remaining EVERs + @param callbackTo address of contract, which implement IAcceptTokensBurnCallback.onAcceptTokensBurn + if it equals to 0:0 then no callbacks + @param payload Custom data will be delivered into IAcceptTokensBurnCallback.onAcceptTokensBurn + */ + function burnByRoot( + uint128 amount, + address remainingGasTo, + address callbackTo, + TvmCell payload + ) external; +} diff --git a/contracts/TIP3/interfaces/IBurnableTokenWallet.sol b/contracts/TIP3/interfaces/IBurnableTokenWallet.sol new file mode 100644 index 0000000..0ecae31 --- /dev/null +++ b/contracts/TIP3/interfaces/IBurnableTokenWallet.sol @@ -0,0 +1,28 @@ +pragma ton-solidity >= 0.57.0; + +/* + +walletOwner -> IBurnableTokenWallet(wallet).burn(...) -> + IBurnPausableTokenRoot(root).tokensBurned(...) -> + IAcceptTokensBurnCallback(callbackTo).onAcceptTokensBurn(...) -> ... +*/ + + +interface IBurnableTokenWallet { + + /* + @notice Allows for walletOwner burn tokens + @dev Can be called only by TokenWallet owner + @param amount Amount tokens to burn + @param remainingGasTo Receiver of the remaining EVERs + @param callbackTo Address of contract, which implement IAcceptTokensBurnCallback.onAcceptTokensBurn + if it equals to 0:0 then no callbacks + @param payload Custom data will be delivered into IAcceptTokensBurnCallback.onAcceptTokensBurn + */ + function burn( + uint128 amount, + address remainingGasTo, + address callbackTo, + TvmCell payload + ) external; +} diff --git a/contracts/TIP3/interfaces/IDestroyable.sol b/contracts/TIP3/interfaces/IDestroyable.sol new file mode 100644 index 0000000..b9f81d6 --- /dev/null +++ b/contracts/TIP3/interfaces/IDestroyable.sol @@ -0,0 +1,5 @@ +pragma ton-solidity >= 0.57.0; + +interface IDestroyable { + function destroy(address remainingGasTo) external; +} diff --git a/contracts/TIP3/interfaces/IDisableableMintTokenRoot.sol b/contracts/TIP3/interfaces/IDisableableMintTokenRoot.sol new file mode 100644 index 0000000..3553e13 --- /dev/null +++ b/contracts/TIP3/interfaces/IDisableableMintTokenRoot.sol @@ -0,0 +1,18 @@ +pragma ton-solidity >= 0.57.0; + + +interface IDisableableMintTokenRoot { + /* + @notice Disable 'mint' forever + @dev Can be called only by rootOwner + @dev This is an irreversible action + @returns true + */ + function disableMint() external responsible returns (bool); + + /* + @notice Get mint disabled status + @returns is 'disableMint' already called + */ + function mintDisabled() external view responsible returns (bool); +} diff --git a/contracts/TIP3/interfaces/ITokenFactory.sol b/contracts/TIP3/interfaces/ITokenFactory.sol new file mode 100644 index 0000000..ec7cb22 --- /dev/null +++ b/contracts/TIP3/interfaces/ITokenFactory.sol @@ -0,0 +1,21 @@ +pragma ton-solidity >= 0.57.0; + + +interface ITokenFactory { + + function deployRoot( + string name, // static + string symbol, // static + uint8 decimals, // static + address owner, // static + address initialSupplyTo, // constructor + uint128 initialSupply, // constructor + uint128 deployWalletValue, // constructor + bool mintDisabled, // constructor + bool burnByRootDisabled, // constructor + bool burnPaused, // constructor + address remainingGasTo, // constructor + bool upgradeable + ) external responsible returns (address); + +} diff --git a/contracts/TIP3/interfaces/ITokenRoot.sol b/contracts/TIP3/interfaces/ITokenRoot.sol new file mode 100644 index 0000000..30126be --- /dev/null +++ b/contracts/TIP3/interfaces/ITokenRoot.sol @@ -0,0 +1,72 @@ +pragma ton-solidity >= 0.57.0; + +import "./TIP3TokenRoot.sol"; +import "./SID.sol"; + +interface ITokenRoot is TIP3TokenRoot, SID { + + /* + @notice Get root owner + @returns rootOwner + */ + function rootOwner() external view responsible returns (address); + + /* + @notice Derive TokenWallet address from owner address + @param _owner TokenWallet owner address + @returns Token wallet address + */ + function walletOf(address owner) external view responsible returns (address); + + /* + @notice Called by TokenWallet, when + @dev Decrease total supply + @dev Can be called only by correct token wallet contract + @dev Fails if root token burn paused + @param amount How much tokens was burned + @param walletOwner Burner TokenWallet owner address + @param remainingGasTo Receiver of the remaining EVERs + @param callbackTo address of contract, which implement IBurnTokensCallback.burnCallback + if it equals to 0:0 then no callbacks + @param payload Custom data will be delivered into IBurnTokensCallback.burnCallback + */ + function acceptBurn( + uint128 amount, + address walletOwner, + address remainingGasTo, + address callbackTo, + TvmCell payload + ) external functionID(0x192B51B1); + + /* + @notice Mint tokens to recipient with deploy wallet optional + @dev Can be called only by rootOwner + @param amount How much tokens to mint + @param recipient Minted tokens owner address + @param deployWalletValue How much EVERs send to wallet on deployment, when == 0 then not deploy wallet before mint + @param remainingGasTo Receiver the remaining balance after deployment. root owner by default + @param notify - when TRUE and recipient specified 'callback' on his own TokenWallet, + then send IAcceptTokensTransferCallback.onAcceptTokensMint to specified callback address, + else this param will be ignored + @param payload - custom payload for IAcceptTokensTransferCallback.onAcceptTokensMint + */ + function mint( + uint128 amount, + address recipient, + uint128 deployWalletValue, + address remainingGasTo, + bool notify, + TvmCell payload + ) external; + + /* + @notice Deploy new TokenWallet + @dev Can be called by anyone + @param owner Token wallet owner address + @param deployWalletValue Gas value to + */ + function deployWallet( + address owner, + uint128 deployWalletValue + ) external responsible returns (address); +} diff --git a/contracts/TIP3/interfaces/ITokenRootUpgradeable.sol b/contracts/TIP3/interfaces/ITokenRootUpgradeable.sol new file mode 100644 index 0000000..6f2c967 --- /dev/null +++ b/contracts/TIP3/interfaces/ITokenRootUpgradeable.sol @@ -0,0 +1,13 @@ +pragma ton-solidity >= 0.57.0; + +import "./ITokenRoot.sol"; + + +interface ITokenRootUpgradeable is ITokenRoot { + function walletVersion() external view responsible returns (uint32); + function platformCode() external view responsible returns (TvmCell); + + function requestUpgradeWallet(uint32 currentVersion, address walletOwner, address remainingGasTo) external; + function setWalletCode(TvmCell code) external; + function upgrade(TvmCell code) external; +} diff --git a/contracts/TIP3/interfaces/ITokenWallet.sol b/contracts/TIP3/interfaces/ITokenWallet.sol new file mode 100644 index 0000000..cd794ec --- /dev/null +++ b/contracts/TIP3/interfaces/ITokenWallet.sol @@ -0,0 +1,82 @@ +pragma ton-solidity >= 0.57.0; + +import "./TIP3TokenWallet.sol"; +import "./SID.sol"; + +interface ITokenWallet is TIP3TokenWallet, SID { + + /* + @notice Get TokenWallet owner address + @returns owner TokenWallet owner address + */ + function owner() external view responsible returns (address); + + /* + @notice Transfer tokens and optionally deploy TokenWallet for recipient + @dev Can be called only by TokenWallet owner + @dev If deployWalletValue !=0 deploy token wallet for recipient using that gas value + @param amount How much tokens to transfer + @param recipient Tokens recipient address + @param deployWalletValue How much EVERs to attach to token wallet deploy + @param remainingGasTo Remaining gas receiver + @param notify Notify receiver on incoming transfer + @param payload Notification payload + */ + function transfer( + uint128 amount, + address recipient, + uint128 deployWalletValue, + address remainingGasTo, + bool notify, + TvmCell payload + ) external; + + /* + @notice Transfer tokens using another TokenWallet address, that wallet must be deployed previously + @dev Can be called only by token wallet owner + @param amount How much tokens to transfer + @param recipientWallet Recipient TokenWallet address + @param remainingGasTo Remaining gas receiver + @param notify Notify receiver on incoming transfer + @param payload Notification payload + */ + function transferToWallet( + uint128 amount, + address recipientTokenWallet, + address remainingGasTo, + bool notify, + TvmCell payload + ) external; + + /* + @notice Callback for transfer operation + @dev Can be called only by another valid TokenWallet contract with same root + @param amount How much tokens to receive + @param sender Sender TokenWallet owner address + @param remainingGasTo Remaining gas receiver + @param notify Notify receiver on incoming transfer + @param payload Notification payload + */ + function acceptTransfer( + uint128 amount, + address sender, + address remainingGasTo, + bool notify, + TvmCell payload + ) external functionID(0x67A0B95F); + + /* + @notice Accept minted tokens from root + @dev Can be called only by TokenRoot + @param amount How much tokens to accept + @param remainingGasTo Remaining gas receiver + @param notify Notify receiver on incoming mint + @param payload Notification payload + */ + function acceptMint( + uint128 amount, + address remainingGasTo, + bool notify, + TvmCell payload + ) external functionID(0x4384F298); +} diff --git a/contracts/TIP3/interfaces/ITokenWalletUpgradeable.sol b/contracts/TIP3/interfaces/ITokenWalletUpgradeable.sol new file mode 100644 index 0000000..b9d412a --- /dev/null +++ b/contracts/TIP3/interfaces/ITokenWalletUpgradeable.sol @@ -0,0 +1,11 @@ +pragma ton-solidity >= 0.57.0; + +import "./ITokenWallet.sol"; +import "./IVersioned.sol"; + + +interface ITokenWalletUpgradeable is ITokenWallet, IVersioned { + function platformCode() external view responsible returns (TvmCell); + function upgrade(address remainingGasTo) external; + function acceptUpgrade(TvmCell code, uint32 newVersion, address remainingGasTo) external; +} diff --git a/contracts/TIP3/interfaces/ITransferTokenRootOwnershipCallback.sol b/contracts/TIP3/interfaces/ITransferTokenRootOwnershipCallback.sol new file mode 100644 index 0000000..6ec22e5 --- /dev/null +++ b/contracts/TIP3/interfaces/ITransferTokenRootOwnershipCallback.sol @@ -0,0 +1,13 @@ +pragma ton-solidity >= 0.57.0; + + +interface ITransferTokenRootOwnershipCallback { + + function onTransferTokenRootOwnership( + address oldOwner, + address newOwner, + address remainingGasTo, + TvmCell payload + ) external; + +} diff --git a/contracts/TIP3/interfaces/ITransferableOwnership.sol b/contracts/TIP3/interfaces/ITransferableOwnership.sol new file mode 100644 index 0000000..7332e92 --- /dev/null +++ b/contracts/TIP3/interfaces/ITransferableOwnership.sol @@ -0,0 +1,18 @@ +pragma ton-solidity >= 0.57.0; + +import "../structures/ICallbackParamsStructure.sol"; + +interface ITransferableOwnership is ICallbackParamsStructure { + /* + @notice Transfer ownership to new owner + @dev Can be called only by current owner + @param newOwner New owner + @param remainingGasTo Remaining gas receiver + @param callbacks for receiving callback + */ + function transferOwnership( + address newOwner, + address remainingGasTo, + mapping(address => CallbackParams) callbacks + ) external; +} diff --git a/contracts/TIP3/interfaces/IVersioned.sol b/contracts/TIP3/interfaces/IVersioned.sol new file mode 100644 index 0000000..92dd644 --- /dev/null +++ b/contracts/TIP3/interfaces/IVersioned.sol @@ -0,0 +1,6 @@ +pragma ton-solidity >= 0.57.0; + + +interface IVersioned { + function version() external view responsible returns (uint32); +} diff --git a/contracts/TIP3/interfaces/SID.sol b/contracts/TIP3/interfaces/SID.sol new file mode 100644 index 0000000..0caa192 --- /dev/null +++ b/contracts/TIP3/interfaces/SID.sol @@ -0,0 +1,10 @@ +pragma ton-solidity >= 0.57.0; + +interface SID { + /// @notice Query if a contract implements an interface + /// @param interfaceID The interface identifier, as specified in TIP6.1 + /// @dev Interface identification is specified in TIP6.1. + /// @return `true` if the contract implements `interfaceID` and + /// `interfaceID` is not 0xffffffff, `false` otherwise + function supportsInterface(bytes4 interfaceID) external view responsible returns (bool); +} diff --git a/contracts/TIP3/interfaces/TIP3TokenRoot.sol b/contracts/TIP3/interfaces/TIP3TokenRoot.sol new file mode 100644 index 0000000..3c2c9ed --- /dev/null +++ b/contracts/TIP3/interfaces/TIP3TokenRoot.sol @@ -0,0 +1,9 @@ +pragma ton-solidity >= 0.57.0; + +interface TIP3TokenRoot { + function name() external view responsible returns (string); + function symbol() external view responsible returns (string); + function decimals() external view responsible returns (uint8); + function totalSupply() external view responsible returns (uint128); + function walletCode() external view responsible returns (TvmCell); +} diff --git a/contracts/TIP3/interfaces/TIP3TokenWallet.sol b/contracts/TIP3/interfaces/TIP3TokenWallet.sol new file mode 100644 index 0000000..184f281 --- /dev/null +++ b/contracts/TIP3/interfaces/TIP3TokenWallet.sol @@ -0,0 +1,7 @@ +pragma ton-solidity >= 0.57.0; + +interface TIP3TokenWallet { + function root() external view responsible returns (address); + function balance() external view responsible returns (uint128); + function walletCode() external view responsible returns (TvmCell); +} diff --git a/contracts/TIP3/libraries/TokenErrors.sol b/contracts/TIP3/libraries/TokenErrors.sol new file mode 100644 index 0000000..b351737 --- /dev/null +++ b/contracts/TIP3/libraries/TokenErrors.sol @@ -0,0 +1,25 @@ +pragma ton-solidity >= 0.57.0; + +library TokenErrors { + + uint16 constant NOT_OWNER = 1000; + uint16 constant NOT_ROOT = 1010; + uint16 constant WRONG_ROOT_OWNER = 1020; + uint16 constant WRONG_WALLET_OWNER = 1021; + uint16 constant WRONG_RECIPIENT = 1030; + uint16 constant NON_ZERO_PUBLIC_KEY = 1040; + uint16 constant WRONG_AMOUNT = 1050; + uint16 constant NOT_ENOUGH_BALANCE = 1060; + uint16 constant NON_EMPTY_BALANCE = 1070; + uint16 constant SENDER_IS_NOT_VALID_WALLET = 1100; + + uint16 constant RECIPIENT_ALLOWS_ONLY_NOTIFIABLE = 1200; + + uint16 constant LOW_GAS_VALUE = 2000; + uint16 constant DEPLOY_WALLET_VALUE_TOO_LOW = 2010; + + uint16 constant MINT_DISABLED = 2100; + + uint16 constant BURN_DISABLED = 2200; + uint16 constant BURN_BY_ROOT_DISABLED = 2210; +} diff --git a/contracts/TIP3/libraries/TokenGas.sol b/contracts/TIP3/libraries/TokenGas.sol new file mode 100644 index 0000000..b6d749f --- /dev/null +++ b/contracts/TIP3/libraries/TokenGas.sol @@ -0,0 +1,6 @@ +pragma ton-solidity >= 0.57.0; + +library TokenGas { + uint128 constant TARGET_ROOT_BALANCE = 1 ton; + uint128 constant TARGET_WALLET_BALANCE = 0.1 ton; +} diff --git a/contracts/TIP3/libraries/TokenMsgFlag.sol b/contracts/TIP3/libraries/TokenMsgFlag.sol new file mode 100644 index 0000000..1e411d5 --- /dev/null +++ b/contracts/TIP3/libraries/TokenMsgFlag.sol @@ -0,0 +1,9 @@ +pragma ton-solidity >= 0.57.0; + +library TokenMsgFlag { + uint8 constant SENDER_PAYS_FEES = 1; + uint8 constant IGNORE_ERRORS = 2; + uint8 constant DESTROY_IF_ZERO = 32; + uint8 constant REMAINING_GAS = 64; + uint8 constant ALL_NOT_RESERVED = 128; +} diff --git a/contracts/TIP3/structures/ICallbackParamsStructure.sol b/contracts/TIP3/structures/ICallbackParamsStructure.sol new file mode 100644 index 0000000..6022461 --- /dev/null +++ b/contracts/TIP3/structures/ICallbackParamsStructure.sol @@ -0,0 +1,8 @@ +pragma ton-solidity >= 0.57.0; + +interface ICallbackParamsStructure { + struct CallbackParams { + uint128 value; + TvmCell payload; + } +} diff --git a/contracts/TIP3/tests/TestRootTransferCallback.sol b/contracts/TIP3/tests/TestRootTransferCallback.sol new file mode 100644 index 0000000..d2326f8 --- /dev/null +++ b/contracts/TIP3/tests/TestRootTransferCallback.sol @@ -0,0 +1,39 @@ +pragma ton-solidity >= 0.57.0; + +import "../additional/Wallet.sol"; +import "../TokenRoot.sol"; + + +struct CallbackData { + address oldOwner; + address newOwner; + address remainingGasTo; + TvmCell payload; +} + + +contract TestRootTransferCallback is Wallet, ITransferTokenRootOwnershipCallback { + + address public _root; + CallbackData public _callback; + + constructor() public { + tvm.accept(); + } + + function setRoot(address root) public { + tvm.accept(); + _root = root; + } + + function onTransferTokenRootOwnership( + address oldOwner, + address newOwner, + address remainingGasTo, + TvmCell payload + ) public override { + require(msg.sender == _root, TokenErrors.NOT_ROOT); + _callback = CallbackData(oldOwner, newOwner, remainingGasTo, payload); + } + +} diff --git a/contracts/TIP3/tests/TestTokenFactory.sol b/contracts/TIP3/tests/TestTokenFactory.sol new file mode 100644 index 0000000..5d3b8f1 --- /dev/null +++ b/contracts/TIP3/tests/TestTokenFactory.sol @@ -0,0 +1,53 @@ +pragma ton-solidity >= 0.57.0; + +import "../additional/TokenFactory.sol"; + + +contract TestTokenFactory is TokenFactory { + + constructor( + address owner, + uint128 deployValue, + TvmCell rootCode, + TvmCell walletCode, + TvmCell rootUpgradeableCode, + TvmCell walletUpgradeableCode, + TvmCell platformCode + ) public TokenFactory(owner, deployValue, rootCode, walletCode, rootUpgradeableCode, walletUpgradeableCode, platformCode) {} + + function deployRootTest( + string name, + string symbol, + uint8 decimals, + address owner, + address initialSupplyTo, + uint128 initialSupply, + uint128 deployWalletValue, + bool mintDisabled, + bool burnByRootDisabled, + bool burnPaused, + address remainingGasTo, + bool upgradeable + ) external responsible returns (address) { + tvm.accept(); + function (uint256, string, string, uint8, address) returns (TvmCell) buildStateInit = + upgradeable ? _buildUpgradeableStateInit : _buildCommonStateInit; + TvmCell stateInit = buildStateInit(_tokenNonce++, name, symbol, decimals, owner); + address root = new TokenRoot { + value: _deployValue, + flag: TokenMsgFlag.SENDER_PAYS_FEES, + bounce: false, + stateInit: stateInit + }( + initialSupplyTo, + initialSupply, + deployWalletValue, + mintDisabled, + burnByRootDisabled, + burnPaused, + remainingGasTo + ); + return {value: 0, flag: TokenMsgFlag.SENDER_PAYS_FEES, bounce: false} root; + } + +} diff --git a/contracts/TIP3/tests/TestTokenRootUpgradeableV2.sol b/contracts/TIP3/tests/TestTokenRootUpgradeableV2.sol new file mode 100644 index 0000000..1bddadd --- /dev/null +++ b/contracts/TIP3/tests/TestTokenRootUpgradeableV2.sol @@ -0,0 +1,30 @@ +pragma ton-solidity >= 0.57.0; + +import "../TokenRootUpgradeable.sol"; + + +contract TestTokenRootUpgradeableV2 is TokenRootUpgradeable { + + constructor( + address initialSupplyTo, + uint128 initialSupply, + uint128 deployWalletValue, + bool mintDisabled, + bool burnByRootDisabled, + bool burnPaused, + address remainingGasTo + ) public TokenRootUpgradeable( + initialSupplyTo, + initialSupply, + deployWalletValue, + mintDisabled, + burnByRootDisabled, + burnPaused, + remainingGasTo + ) {} + + function onlyInV2() public pure responsible returns (string) { + return{value: 0, bounce: false, flag: 64} "Some method in root v2"; + } + +} diff --git a/contracts/TIP3/tests/TestTokenWalletUpgradeableV2.sol b/contracts/TIP3/tests/TestTokenWalletUpgradeableV2.sol new file mode 100644 index 0000000..f0fb980 --- /dev/null +++ b/contracts/TIP3/tests/TestTokenWalletUpgradeableV2.sol @@ -0,0 +1,12 @@ +pragma ton-solidity >= 0.57.0; + +import "../TokenWalletUpgradeable.sol"; + + +contract TestTokenWalletUpgradeableV2 is TokenWalletUpgradeable { + + function onlyInV2() public pure responsible returns (string) { + return{value: 0, bounce: false, flag: 64} "Some method in wallet v2"; + } + +} diff --git a/contracts/TIP3/tests/TestWalletCallback.sol b/contracts/TIP3/tests/TestWalletCallback.sol new file mode 100644 index 0000000..9627863 --- /dev/null +++ b/contracts/TIP3/tests/TestWalletCallback.sol @@ -0,0 +1,132 @@ +pragma ton-solidity >= 0.57.0; + +import "../additional/Wallet.sol"; +import "../TokenRoot.sol"; + + +struct TransferData { + uint128 amount; + address sender; + address senderWallet; + address remainingGasTo; + TvmCell payload; +} + + +contract TestWalletCallback is + Wallet, + IAcceptTokensTransferCallback, + IBounceTokensTransferCallback, + IAcceptTokensMintCallback, + IAcceptTokensBurnCallback, + IBounceTokensBurnCallback +{ + uint16 WRONG_ROOT = 10001; + uint16 WRONG_OWNER = 10002; + uint16 WRONG_WALLET = 10003; + uint16 WRONG_VERSION = 10004; + + address public _root; + address public _wallet; + TransferData public _transfer; + + bool public _bounced; + uint128 public _bouncedAmount; + address public _bouncedFrom; + + bool public _minted; + uint128 public _mintedAmount; + TvmCell public _mintedPayload; + + bool public _burned; + uint128 public _burnedAmount; + TvmCell public _burnedPayload; + bool public _burnedBounced; + + + constructor(address root) public { + tvm.accept(); + _root = root; + } + + function deployWallet(address walletOwner, uint128 deployWalletValue) public view { + tvm.accept(); + TokenRoot(_root).deployWallet{ + value: deployWalletValue, + flag: TokenMsgFlag.SENDER_PAYS_FEES, + callback: onDeployWallet + }(walletOwner, deployWalletValue); + } + + function onDeployWallet(address wallet) public { + require(msg.sender == _root, WRONG_ROOT); + _wallet = wallet; + } + + function onAcceptTokensTransfer( + address tokenRoot, + uint128 amount, + address sender, + address senderWallet, + address remainingGasTo, + TvmCell payload + ) public override { + require(msg.sender == _wallet, WRONG_WALLET); + require(tokenRoot == _root, WRONG_ROOT); + _transfer = TransferData(amount, sender, senderWallet, remainingGasTo, payload); + remainingGasTo.transfer({value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false}); + } + + function onBounceTokensTransfer( + address tokenRoot, + uint128 amount, + address revertedFrom + ) public override { + require(msg.sender == _wallet, WRONG_WALLET); + require(tokenRoot == _root, WRONG_ROOT); + _bounced = true; + _bouncedAmount = amount; + _bouncedFrom = revertedFrom; + } + + function onAcceptTokensMint( + address tokenRoot, + uint128 amount, + address remainingGasTo, + TvmCell payload + ) public override { + require(msg.sender == _wallet, WRONG_WALLET); + require(tokenRoot == _root, WRONG_ROOT); + _minted = true; + _mintedAmount = amount; + _mintedPayload = payload; + remainingGasTo.transfer({value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false}); + } + + function onAcceptTokensBurn( + uint128 amount, + address walletOwner, + address wallet, + address remainingGasTo, + TvmCell payload + ) public override { + require(msg.sender == _root, WRONG_ROOT); + require(walletOwner == address(this), WRONG_OWNER); + require(wallet == _wallet, WRONG_WALLET); + _burned = true; + _burnedAmount = amount; + _burnedPayload = payload; + remainingGasTo.transfer({value: 0, flag: TokenMsgFlag.REMAINING_GAS, bounce: false}); + } + + function onBounceTokensBurn( + address tokenRoot, + uint128 amount + ) public override { + require(msg.sender == _wallet, WRONG_WALLET); + require(tokenRoot == _root, WRONG_ROOT); + _burnedBounced = true; + _burnedAmount = amount; + } + +} diff --git a/contracts/TokenFactory.sol b/contracts/TokenFactory.sol deleted file mode 100644 index 2cacbf6..0000000 --- a/contracts/TokenFactory.sol +++ /dev/null @@ -1,30 +0,0 @@ -pragma ever-solidity >= 0.61.2; - -import './ERC20/ERC20Burnable.sol'; -import './Owned.sol'; - -contract TokenFactory is Owned { - mapping(address => bool) public isAuditor; - - TvmCell static tokenCode_; - - function addAuditor(address _auditor) public onlyOwner { - isAuditor[_auditor] = true; - } - - function removeAuditor(address _auditor) public onlyOwner { - isAuditor[_auditor] = false; - } - - function deployToken(string _name, string _symbol, uint8 _decimals, - uint _start_count, uint128 deployValue) public - { - require(isAuditor[msg.sender]); - - new ERC20Burnable{ - value: deployValue, - code: tokenCode_ - }(_name, _symbol, _decimals, - _start_count, msg.sender); - } -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 95f316e..9fcf147 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "locklift-project", "version": "1.0.0", "license": "ISC", + "dependencies": { + "@broxus/contracts": "^1.1.0" + }, "devDependencies": { "@types/chai": "^4.3.4", "@types/mocha": "^10.0.0", @@ -23,39 +26,56 @@ "node_modules/@broxus/await-semaphore": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@broxus/await-semaphore/-/await-semaphore-0.1.5.tgz", - "integrity": "sha512-g464HtHHKxk6r6bkZc+lET1PuSgcFxlLHVb7EAqfxTlx6DRcYkjPRIQQhRHB3BQ6zRpfMrYkppL0tBtRED+HNA==", - "dev": true + "integrity": "sha512-g464HtHHKxk6r6bkZc+lET1PuSgcFxlLHVb7EAqfxTlx6DRcYkjPRIQQhRHB3BQ6zRpfMrYkppL0tBtRED+HNA==" + }, + "node_modules/@broxus/contracts": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@broxus/contracts/-/contracts-1.1.0.tgz", + "integrity": "sha512-9a13iXHSLNil3I+QMs3o+t8EVG1aM7pBNv31ckdTjhLLgydqP131xibg0Qw8BBFkbvEPA6nT9yfeFrGKrfPTHA==", + "dependencies": { + "@types/chai-as-promised": "^7.1.5", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", + "everscale-crypto": "^0.1.1", + "locklift": "^2.1.6", + "mocha-logger": "^1.0.7" + } }, "node_modules/@types/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dependencies": { + "@types/chai": "*" + } }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, "optional": true }, "node_modules/@types/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", "dev": true }, "node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", - "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", - "dev": true, + "version": "17.0.15", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", + "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", "dependencies": { "@types/yargs-parser": "*" } @@ -63,14 +83,17 @@ "node_modules/@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, "engines": { "node": ">=6" } @@ -79,7 +102,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -88,7 +110,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -100,10 +121,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -115,14 +135,12 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-back": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, "engines": { "node": ">=6" } @@ -131,7 +149,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -140,7 +157,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, "engines": { "node": "*" } @@ -148,20 +164,17 @@ "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dev": true, "dependencies": { "follow-redirects": "^1.14.9", "form-data": "^4.0.0" @@ -170,14 +183,12 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bignumber.js": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true, "engines": { "node": "*" } @@ -186,7 +197,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -195,7 +205,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -205,7 +214,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -216,20 +224,17 @@ "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, "engines": { "node": ">=10" }, @@ -241,7 +246,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -255,11 +259,21 @@ "node": ">=4" } }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -275,7 +289,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, "engines": { "node": "*" } @@ -284,7 +297,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -311,7 +323,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -325,7 +336,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -336,14 +346,12 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -355,7 +363,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -370,7 +377,6 @@ "version": "6.1.3", "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -385,7 +391,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -397,7 +402,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, "engines": { "node": ">=8" } @@ -406,7 +410,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -420,7 +423,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -428,14 +430,12 @@ "node_modules/command-line-usage/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/command-line-usage/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -444,7 +444,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -453,7 +452,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -465,7 +463,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, "engines": { "node": ">=8" } @@ -474,7 +471,6 @@ "version": "9.4.1", "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true, "engines": { "node": "^12.20.0 || >=14" } @@ -482,14 +478,12 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -505,14 +499,12 @@ "node_modules/debug/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -524,7 +516,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", - "dev": true, "dependencies": { "type-detect": "^4.0.0" }, @@ -536,7 +527,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, "engines": { "node": ">=4.0.0" } @@ -545,7 +535,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -554,16 +543,14 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/directory-tree": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/directory-tree/-/directory-tree-3.3.2.tgz", - "integrity": "sha512-xKCpBi7AAzC3IJA2shcYbm7NhA7WwC9B5EzNZutY9EXqmUM8VUEUGEEK3fQjeSFvX841qdIzTEMkjzExdbNQvg==", - "dev": true, + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/directory-tree/-/directory-tree-3.4.0.tgz", + "integrity": "sha512-8eNxj/KngIac7449j8GYzapoDfr0DjtR/HMKwYBI4xqnBRLVkVAs1hzso1pimXK/U8ihAXlKmxVAmorb/GD/Rg==", "dependencies": { "command-line-args": "^5.2.0", "command-line-usage": "^6.1.1" @@ -579,7 +566,6 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, "dependencies": { "jake": "^10.8.5" }, @@ -593,14 +579,12 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "engines": { "node": ">=6" } @@ -609,7 +593,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -618,7 +601,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -630,7 +612,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -638,25 +619,22 @@ "node_modules/everscale-crypto": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/everscale-crypto/-/everscale-crypto-0.1.1.tgz", - "integrity": "sha512-DoocTqkz1cayTu4UDdP7dUEcDMfCqchNNKhIgsXQAqhlwRExsNQ1Omo2C/JiuQ3rMzr3XxvqrCwLeLTiOrbXYQ==", - "dev": true + "integrity": "sha512-DoocTqkz1cayTu4UDdP7dUEcDMfCqchNNKhIgsXQAqhlwRExsNQ1Omo2C/JiuQ3rMzr3XxvqrCwLeLTiOrbXYQ==" }, "node_modules/everscale-inpage-provider": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/everscale-inpage-provider/-/everscale-inpage-provider-0.3.43.tgz", - "integrity": "sha512-AFqo6RAurwpnz7UvHu2O/3BK8nHElBQ7vfvUaDOJB8zzcd28pD26TflZbYRWzgoP7RNOM69h3WcmiWtlHl8pVw==", - "dev": true + "version": "0.3.45", + "resolved": "https://registry.npmjs.org/everscale-inpage-provider/-/everscale-inpage-provider-0.3.45.tgz", + "integrity": "sha512-e28/9AyAOtpyz9xHa2eRJsPUNvM5jD/BVA8+GYk8bnLENczkbtZEf9Rp4m+1XTZblJedbY0Al8cMZV5IiKGa4g==" }, "node_modules/everscale-standalone-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/everscale-standalone-client/-/everscale-standalone-client-2.1.1.tgz", - "integrity": "sha512-4OqHWLPZ7lqJ10m9Uu0vMsYa/oEXx+8fw9IRdKRpEmer5a7bzQFc14baCtFVot23pP2k7prGJ6kLeuZCL+CxMg==", - "dev": true, + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/everscale-standalone-client/-/everscale-standalone-client-2.1.5.tgz", + "integrity": "sha512-dp5pCABzJsW+ZSfBUlSr3f8xRjYBOCxM8t7YaiA7dhMsC1rfmDRVoT5mgnOeyJPLq9k21XgZvLOJAF97PhmnRA==", "dependencies": { "@broxus/await-semaphore": "^0.1.5", "bignumber.js": "^9.1.0", "events": "^3.3.0", - "everscale-inpage-provider": "^0.3.41", + "everscale-inpage-provider": "^0.3.45", "fast-safe-stringify": "^2.1.1", "nekoton-wasm": "^1.0.5", "node-fetch": "^2.6.7" @@ -665,14 +643,12 @@ "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, "dependencies": { "minimatch": "^5.0.1" } @@ -681,16 +657,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -702,7 +676,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -714,7 +687,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, "dependencies": { "array-back": "^3.0.1" }, @@ -726,7 +698,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -742,7 +713,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, "bin": { "flat": "cli.js" } @@ -751,7 +721,6 @@ "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, "funding": [ { "type": "individual", @@ -771,7 +740,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -785,7 +753,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -798,14 +765,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -819,7 +784,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -828,7 +792,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, "engines": { "node": "*" } @@ -837,7 +800,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -846,7 +808,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -866,7 +827,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -877,14 +837,20 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "engines": { + "node": ">=4.x" + } }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -893,7 +859,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, "bin": { "he": "bin/he" } @@ -902,7 +867,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -911,14 +875,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -930,7 +892,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -939,7 +900,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -948,7 +908,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -960,7 +919,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -969,7 +927,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, "engines": { "node": ">=8" } @@ -978,7 +935,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "engines": { "node": ">=10" }, @@ -986,11 +942,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, "node_modules/jake": { "version": "10.8.5", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -1008,7 +968,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -1020,7 +979,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -1032,7 +990,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -1044,7 +1001,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -1059,7 +1015,6 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/locklift/-/locklift-2.4.4.tgz", "integrity": "sha512-G6mUkgEq/2/RJ5Lr0/WP/E+pSGTYnh8/TyKKt8p1d8xyL3F5zIN/9nSD4IEOXj4biKzZWVyOGtxyW2253S6gHA==", - "dev": true, "dependencies": { "@types/yargs": "^17.0.13", "axios": "^0.27.2", @@ -1096,20 +1051,17 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -1125,7 +1077,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, "dependencies": { "get-func-name": "^2.0.0" } @@ -1133,20 +1084,17 @@ "node_modules/lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -1155,7 +1103,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -1167,7 +1114,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1179,7 +1125,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1188,7 +1133,6 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "dependencies": { "minimist": "^1.2.6" }, @@ -1200,7 +1144,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -1236,11 +1179,152 @@ "url": "https://opencollective.com/mochajs" } }, + "node_modules/mocha-logger": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/mocha-logger/-/mocha-logger-1.0.8.tgz", + "integrity": "sha512-TrdbQqsWUO9TtyRpL2wInVVcp00BSWQazweWIgq5uGYTpHrQZrMjtihystmP6Vk+HuGRHdvNq7lRM/LQNULSog==", + "dependencies": { + "mocha": "^9.2.2" + }, + "peerDependencies": { + "mocha": "^9.2.2" + } + }, + "node_modules/mocha-logger/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha-logger/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha-logger/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mocha-logger/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha-logger/node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha-logger/node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/mocha-logger/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha-logger/node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==" + }, + "node_modules/mocha-logger/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -1249,7 +1333,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1260,7 +1343,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1272,7 +1354,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -1287,7 +1368,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -1304,14 +1384,12 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1322,14 +1400,12 @@ "node_modules/nekoton-wasm": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/nekoton-wasm/-/nekoton-wasm-1.0.9.tgz", - "integrity": "sha512-OIr6p080TjYYfnW6YOca8dHuX96DoC/oyftE+3IpW8GMN0aEEAQ5xLm5t8Vz4ntJpthU6JcboR7dqFUroPT4Kw==", - "dev": true + "integrity": "sha512-OIr6p080TjYYfnW6YOca8dHuX96DoC/oyftE+3IpW8GMN0aEEAQ5xLm5t8Vz4ntJpthU6JcboR7dqFUroPT4Kw==" }, "node_modules/no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, "dependencies": { "lower-case": "^1.1.1" } @@ -1338,7 +1414,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -1357,14 +1432,12 @@ "node_modules/node-gzip": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/node-gzip/-/node-gzip-1.1.2.tgz", - "integrity": "sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==", - "dev": true + "integrity": "sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1373,7 +1446,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -1382,7 +1454,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -1397,7 +1468,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -1412,7 +1482,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -1421,7 +1490,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1430,7 +1498,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, "engines": { "node": "*" } @@ -1439,7 +1506,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -1448,9 +1514,9 @@ } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", + "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -1466,7 +1532,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -1475,7 +1540,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -1487,7 +1551,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, "engines": { "node": ">=6" } @@ -1496,7 +1559,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1505,7 +1567,6 @@ "version": "7.5.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", - "dev": true, "dependencies": { "tslib": "^2.1.0" } @@ -1514,7 +1575,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -1534,7 +1594,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", - "dev": true, "dependencies": { "no-case": "^2.2.0", "upper-case-first": "^1.1.2" @@ -1544,7 +1603,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -1553,7 +1611,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1562,7 +1619,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -1572,7 +1628,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/split-text-to-chunks/-/split-text-to-chunks-1.0.0.tgz", "integrity": "sha512-HLtEwXK/T4l7QZSJ/kOSsZC0o5e2Xg3GzKKFxm0ZexJXw0Bo4CaEl39l7MCSRHk9EOOL5jT8JIDjmhTtcoe6lQ==", - "dev": true, "dependencies": { "get-stdin": "^5.0.1", "minimist": "^1.2.0" @@ -1585,7 +1640,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1599,7 +1653,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1611,7 +1664,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, "engines": { "node": ">=4" } @@ -1620,7 +1672,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -1632,7 +1683,6 @@ "version": "0.16.7", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.16.7.tgz", "integrity": "sha512-4ZZTrXlP4XzCrgh4vOfPDL6dL7zZm5aPl78eczwFSrwvxtsEnKRrSGID6Sbt0agycUoo4auRdWSNTX+oQ3KFyA==", - "dev": true, "engines": { "node": ">=14.0.0" } @@ -1641,7 +1691,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -1653,7 +1702,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -1668,7 +1716,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, "engines": { "node": ">=8" } @@ -1677,7 +1724,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, "engines": { "node": ">=8" } @@ -1686,7 +1732,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/tablemark/-/tablemark-2.0.0.tgz", "integrity": "sha512-bgvShWeSUIWO4j6NH7wGrn1xUQMJ/LRZFIRWE6ka5CFNfQ5qOP9FB4amKCurUUr7C0K4AJGHYDLkaf8A6t5Aww==", - "dev": true, "dependencies": { "sentence-case": "^2.1.1", "split-text-to-chunks": "^1.0.0" @@ -1699,7 +1744,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -1710,14 +1754,12 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-mocha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", - "dev": true, "dependencies": { "ts-node": "7.0.1" }, @@ -1738,7 +1780,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, "optional": true, "dependencies": { "minimist": "^1.2.0" @@ -1751,7 +1792,6 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, "optional": true, "dependencies": { "@types/json5": "^0.0.29", @@ -1764,7 +1804,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, "dependencies": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", @@ -1786,16 +1825,14 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/tsconfig-paths": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz", - "integrity": "sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.1.tgz", + "integrity": "sha512-VgPrtLKpRgEAJsMj5Q/I/mXouC6A/7eJ/X4Nuk6o0cRPwBtznYxTCU4FodbexbzH9somBPEXYi0ZkUViUpJ21Q==", "dependencies": { "json5": "^2.2.1", "minimist": "^1.2.6", @@ -1808,23 +1845,20 @@ "node_modules/tslib": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, "engines": { "node": ">=4" } }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1837,7 +1871,6 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", - "dev": true, "dependencies": { "typescript-logic": "^0.0.0" } @@ -1845,14 +1878,12 @@ "node_modules/typescript-logic": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", - "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", - "dev": true + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==" }, "node_modules/typescript-tuple": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-5.0.1.tgz", "integrity": "sha512-QdAYG/L0vUwtJUVGHmp+Jt8/2l+gOMFwCwLpIhUHNDUxyLWOxuDR/2HWNUNGJtZJuoDvOF3yXMSeK9h90H0OiA==", - "dev": true, "dependencies": { "typescript-compare": "^0.0.2" } @@ -1861,7 +1892,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, "engines": { "node": ">=8" } @@ -1869,14 +1899,12 @@ "node_modules/underscore": { "version": "1.13.6", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "dev": true + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -1884,14 +1912,12 @@ "node_modules/upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" }, "node_modules/upper-case-first": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", - "dev": true, "dependencies": { "upper-case": "^1.1.1" } @@ -1899,24 +1925,35 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/wordwrapjs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -1929,7 +1966,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, "engines": { "node": ">=8" } @@ -1937,14 +1973,12 @@ "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1960,14 +1994,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -1976,7 +2008,6 @@ "version": "17.6.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -1994,7 +2025,6 @@ "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, "engines": { "node": ">=10" } @@ -2003,7 +2033,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -2018,7 +2047,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } @@ -2027,7 +2055,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", - "dev": true, "engines": { "node": ">=4" } @@ -2036,7 +2063,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -2049,39 +2075,56 @@ "@broxus/await-semaphore": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@broxus/await-semaphore/-/await-semaphore-0.1.5.tgz", - "integrity": "sha512-g464HtHHKxk6r6bkZc+lET1PuSgcFxlLHVb7EAqfxTlx6DRcYkjPRIQQhRHB3BQ6zRpfMrYkppL0tBtRED+HNA==", - "dev": true + "integrity": "sha512-g464HtHHKxk6r6bkZc+lET1PuSgcFxlLHVb7EAqfxTlx6DRcYkjPRIQQhRHB3BQ6zRpfMrYkppL0tBtRED+HNA==" + }, + "@broxus/contracts": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@broxus/contracts/-/contracts-1.1.0.tgz", + "integrity": "sha512-9a13iXHSLNil3I+QMs3o+t8EVG1aM7pBNv31ckdTjhLLgydqP131xibg0Qw8BBFkbvEPA6nT9yfeFrGKrfPTHA==", + "requires": { + "@types/chai-as-promised": "^7.1.5", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", + "everscale-crypto": "^0.1.1", + "locklift": "^2.1.6", + "mocha-logger": "^1.0.7" + } }, "@types/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + }, + "@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "requires": { + "@types/chai": "*" + } }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, "optional": true }, "@types/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", "dev": true }, "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", "dev": true }, "@types/yargs": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", - "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", - "dev": true, + "version": "17.0.15", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", + "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", "requires": { "@types/yargs-parser": "*" } @@ -2089,35 +2132,35 @@ "@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2126,44 +2169,37 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-back": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==" }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "axios": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dev": true, "requires": { "follow-redirects": "^1.14.9", "form-data": "^4.0.0" @@ -2172,26 +2208,22 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "bignumber.js": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2201,7 +2233,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -2209,26 +2240,22 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -2239,11 +2266,18 @@ "type-detect": "^4.0.5" } }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "requires": { + "check-error": "^1.0.2" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2252,14 +2286,12 @@ "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2275,7 +2307,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2286,7 +2317,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -2294,14 +2324,12 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -2310,7 +2338,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, "requires": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -2322,7 +2349,6 @@ "version": "6.1.3", "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, "requires": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -2334,7 +2360,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -2342,14 +2367,12 @@ "array-back": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2360,7 +2383,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -2368,26 +2390,22 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -2395,28 +2413,24 @@ "typical": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" } } }, "commander": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" }, @@ -2424,22 +2438,19 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" }, "deep-eql": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", - "dev": true, "requires": { "type-detect": "^4.0.0" } @@ -2447,26 +2458,22 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" }, "directory-tree": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/directory-tree/-/directory-tree-3.3.2.tgz", - "integrity": "sha512-xKCpBi7AAzC3IJA2shcYbm7NhA7WwC9B5EzNZutY9EXqmUM8VUEUGEEK3fQjeSFvX841qdIzTEMkjzExdbNQvg==", - "dev": true, + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/directory-tree/-/directory-tree-3.4.0.tgz", + "integrity": "sha512-8eNxj/KngIac7449j8GYzapoDfr0DjtR/HMKwYBI4xqnBRLVkVAs1hzso1pimXK/U8ihAXlKmxVAmorb/GD/Rg==", "requires": { "command-line-args": "^5.2.0", "command-line-usage": "^6.1.1" @@ -2476,7 +2483,6 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, "requires": { "jake": "^10.8.5" } @@ -2484,55 +2490,47 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "everscale-crypto": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/everscale-crypto/-/everscale-crypto-0.1.1.tgz", - "integrity": "sha512-DoocTqkz1cayTu4UDdP7dUEcDMfCqchNNKhIgsXQAqhlwRExsNQ1Omo2C/JiuQ3rMzr3XxvqrCwLeLTiOrbXYQ==", - "dev": true + "integrity": "sha512-DoocTqkz1cayTu4UDdP7dUEcDMfCqchNNKhIgsXQAqhlwRExsNQ1Omo2C/JiuQ3rMzr3XxvqrCwLeLTiOrbXYQ==" }, "everscale-inpage-provider": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/everscale-inpage-provider/-/everscale-inpage-provider-0.3.43.tgz", - "integrity": "sha512-AFqo6RAurwpnz7UvHu2O/3BK8nHElBQ7vfvUaDOJB8zzcd28pD26TflZbYRWzgoP7RNOM69h3WcmiWtlHl8pVw==", - "dev": true + "version": "0.3.45", + "resolved": "https://registry.npmjs.org/everscale-inpage-provider/-/everscale-inpage-provider-0.3.45.tgz", + "integrity": "sha512-e28/9AyAOtpyz9xHa2eRJsPUNvM5jD/BVA8+GYk8bnLENczkbtZEf9Rp4m+1XTZblJedbY0Al8cMZV5IiKGa4g==" }, "everscale-standalone-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/everscale-standalone-client/-/everscale-standalone-client-2.1.1.tgz", - "integrity": "sha512-4OqHWLPZ7lqJ10m9Uu0vMsYa/oEXx+8fw9IRdKRpEmer5a7bzQFc14baCtFVot23pP2k7prGJ6kLeuZCL+CxMg==", - "dev": true, + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/everscale-standalone-client/-/everscale-standalone-client-2.1.5.tgz", + "integrity": "sha512-dp5pCABzJsW+ZSfBUlSr3f8xRjYBOCxM8t7YaiA7dhMsC1rfmDRVoT5mgnOeyJPLq9k21XgZvLOJAF97PhmnRA==", "requires": { "@broxus/await-semaphore": "^0.1.5", "bignumber.js": "^9.1.0", "events": "^3.3.0", - "everscale-inpage-provider": "^0.3.41", + "everscale-inpage-provider": "^0.3.45", "fast-safe-stringify": "^2.1.1", "nekoton-wasm": "^1.0.5", "node-fetch": "^2.6.7" @@ -2541,14 +2539,12 @@ "fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, "requires": { "minimatch": "^5.0.1" }, @@ -2557,16 +2553,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "requires": { "balanced-match": "^1.0.0" } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "requires": { "brace-expansion": "^2.0.1" } @@ -2577,7 +2571,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -2586,7 +2579,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, "requires": { "array-back": "^3.0.1" } @@ -2595,7 +2587,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2604,20 +2595,17 @@ "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -2628,7 +2616,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2638,39 +2625,33 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" }, "get-stdin": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", - "dev": true + "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==" }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2684,7 +2665,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -2692,26 +2672,27 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -2720,14 +2701,12 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -2735,20 +2714,17 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -2756,26 +2732,27 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "jake": { "version": "10.8.5", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, "requires": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -2787,7 +2764,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -2795,14 +2771,12 @@ "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -2812,7 +2786,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "requires": { "p-locate": "^5.0.0" } @@ -2821,7 +2794,6 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/locklift/-/locklift-2.4.4.tgz", "integrity": "sha512-G6mUkgEq/2/RJ5Lr0/WP/E+pSGTYnh8/TyKKt8p1d8xyL3F5zIN/9nSD4IEOXj4biKzZWVyOGtxyW2253S6gHA==", - "dev": true, "requires": { "@types/yargs": "^17.0.13", "axios": "^0.27.2", @@ -2852,20 +2824,17 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -2875,7 +2844,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, "requires": { "get-func-name": "^2.0.0" } @@ -2883,26 +2851,22 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -2911,7 +2875,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2919,14 +2882,12 @@ "minimist": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "requires": { "minimist": "^1.2.6" } @@ -2935,7 +2896,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, "requires": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -2964,7 +2924,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "requires": { "balanced-match": "^1.0.0" } @@ -2973,7 +2932,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2984,7 +2942,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, "requires": { "brace-expansion": "^2.0.1" } @@ -2993,7 +2950,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -3002,7 +2958,112 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "mocha-logger": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/mocha-logger/-/mocha-logger-1.0.8.tgz", + "integrity": "sha512-TrdbQqsWUO9TtyRpL2wInVVcp00BSWQazweWIgq5uGYTpHrQZrMjtihystmP6Vk+HuGRHdvNq7lRM/LQNULSog==", + "requires": { + "mocha": "^9.2.2" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + } + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -3018,26 +3079,22 @@ "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" }, "nekoton-wasm": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/nekoton-wasm/-/nekoton-wasm-1.0.9.tgz", - "integrity": "sha512-OIr6p080TjYYfnW6YOca8dHuX96DoC/oyftE+3IpW8GMN0aEEAQ5xLm5t8Vz4ntJpthU6JcboR7dqFUroPT4Kw==", - "dev": true + "integrity": "sha512-OIr6p080TjYYfnW6YOca8dHuX96DoC/oyftE+3IpW8GMN0aEEAQ5xLm5t8Vz4ntJpthU6JcboR7dqFUroPT4Kw==" }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, "requires": { "lower-case": "^1.1.1" } @@ -3046,7 +3103,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, "requires": { "whatwg-url": "^5.0.0" } @@ -3054,20 +3110,17 @@ "node-gzip": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/node-gzip/-/node-gzip-1.1.2.tgz", - "integrity": "sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==", - "dev": true + "integrity": "sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==" }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -3076,7 +3129,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "requires": { "yocto-queue": "^0.1.0" } @@ -3085,7 +3137,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "requires": { "p-limit": "^3.0.2" } @@ -3093,38 +3144,33 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", + "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", "dev": true }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -3133,7 +3179,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -3141,20 +3186,17 @@ "reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==" }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "rxjs": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", - "dev": true, "requires": { "tslib": "^2.1.0" } @@ -3162,14 +3204,12 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "sentence-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", - "dev": true, "requires": { "no-case": "^2.2.0", "upper-case-first": "^1.1.2" @@ -3179,7 +3219,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, "requires": { "randombytes": "^2.1.0" } @@ -3187,14 +3226,12 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3204,7 +3241,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/split-text-to-chunks/-/split-text-to-chunks-1.0.0.tgz", "integrity": "sha512-HLtEwXK/T4l7QZSJ/kOSsZC0o5e2Xg3GzKKFxm0ZexJXw0Bo4CaEl39l7MCSRHk9EOOL5jT8JIDjmhTtcoe6lQ==", - "dev": true, "requires": { "get-stdin": "^5.0.1", "minimist": "^1.2.0" @@ -3214,7 +3250,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3225,7 +3260,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -3233,26 +3267,22 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "superstruct": { "version": "0.16.7", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.16.7.tgz", - "integrity": "sha512-4ZZTrXlP4XzCrgh4vOfPDL6dL7zZm5aPl78eczwFSrwvxtsEnKRrSGID6Sbt0agycUoo4auRdWSNTX+oQ3KFyA==", - "dev": true + "integrity": "sha512-4ZZTrXlP4XzCrgh4vOfPDL6dL7zZm5aPl78eczwFSrwvxtsEnKRrSGID6Sbt0agycUoo4auRdWSNTX+oQ3KFyA==" }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -3261,7 +3291,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, "requires": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -3272,14 +3301,12 @@ "array-back": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" }, "typical": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" } } }, @@ -3287,7 +3314,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/tablemark/-/tablemark-2.0.0.tgz", "integrity": "sha512-bgvShWeSUIWO4j6NH7wGrn1xUQMJ/LRZFIRWE6ka5CFNfQ5qOP9FB4amKCurUUr7C0K4AJGHYDLkaf8A6t5Aww==", - "dev": true, "requires": { "sentence-case": "^2.1.1", "split-text-to-chunks": "^1.0.0" @@ -3297,7 +3323,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -3305,14 +3330,12 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "ts-mocha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", - "dev": true, "requires": { "ts-node": "7.0.1", "tsconfig-paths": "^3.5.0" @@ -3322,7 +3345,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, "optional": true, "requires": { "minimist": "^1.2.0" @@ -3332,7 +3354,6 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, "optional": true, "requires": { "@types/json5": "^0.0.29", @@ -3347,7 +3368,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, "requires": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", @@ -3362,16 +3382,14 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" } } }, "tsconfig-paths": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz", - "integrity": "sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.1.tgz", + "integrity": "sha512-VgPrtLKpRgEAJsMj5Q/I/mXouC6A/7eJ/X4Nuk6o0cRPwBtznYxTCU4FodbexbzH9somBPEXYi0ZkUViUpJ21Q==", "requires": { "json5": "^2.2.1", "minimist": "^1.2.6", @@ -3381,26 +3399,22 @@ "tslib": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==" }, "typescript-compare": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", - "dev": true, "requires": { "typescript-logic": "^0.0.0" } @@ -3408,14 +3422,12 @@ "typescript-logic": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", - "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", - "dev": true + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==" }, "typescript-tuple": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-5.0.1.tgz", "integrity": "sha512-QdAYG/L0vUwtJUVGHmp+Jt8/2l+gOMFwCwLpIhUHNDUxyLWOxuDR/2HWNUNGJtZJuoDvOF3yXMSeK9h90H0OiA==", - "dev": true, "requires": { "typescript-compare": "^0.0.2" } @@ -3423,32 +3435,27 @@ "typical": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" }, "underscore": { "version": "1.13.6", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "dev": true + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" }, "upper-case-first": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", - "dev": true, "requires": { "upper-case": "^1.1.1" } @@ -3456,24 +3463,29 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, "wordwrapjs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, "requires": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -3482,22 +3494,19 @@ "typical": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" } } }, "workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -3507,20 +3516,17 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yargs": { "version": "17.6.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -3534,22 +3540,19 @@ "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" } } }, "yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" }, "yargs-unparser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, "requires": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -3560,14 +3563,12 @@ "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", - "dev": true + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==" }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index 7f30a89..c0df160 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,8 @@ "prettier": "^2.7.1", "ts-mocha": "^10.0.0", "typescript": "^4.7.4" + }, + "dependencies": { + "@broxus/contracts": "^1.1.0" } } diff --git a/scripts/1-deploy-assetFactory.ts b/scripts/1-deploy-assetFactory.ts new file mode 100644 index 0000000..980b379 --- /dev/null +++ b/scripts/1-deploy-assetFactory.ts @@ -0,0 +1,33 @@ +import { getRandomNonce } from "locklift"; +import { WalletV3Account} from "everscale-standalone-client/nodejs"; + + +export async function deployAssetFactory() { + const signer = (await locklift.keystore.getSigner("0"))!; + const tokenRoot = await locklift.factory.getContractArtifacts("TokenRoot"); + const tokenWallet = await locklift.factory.getContractArtifacts("TokenWallet"); + const wallet = await WalletV3Account.fromPubkey({publicKey: signer.publicKey, workchain: 0}); + console.log(`Wallet address: ${wallet.address}`); + const { contract: factory, tx } = await locklift.factory.deployContract({ + contract: "AssetFactory", + publicKey: signer.publicKey, + initParams: { + _randomNonce: getRandomNonce() + }, + constructorParams: { + owner: wallet.address, + deployValue: locklift.utils.toNano(3), + rootCode: tokenRoot.code, + walletCode: tokenWallet.code, + rootUpgradeableCode: "", + walletUpgradeableCode: "", + platformCode: "" + }, + value: locklift.utils.toNano(10), + }); + console.log(`TokenFactory deployed at: ${factory.address.toString()}`); +} + +(async () => { + await deployAssetFactory(); +})(); \ No newline at end of file diff --git a/scripts/1-deploy-erc20.ts b/scripts/1-deploy-erc20.ts deleted file mode 100644 index 46fef9e..0000000 --- a/scripts/1-deploy-erc20.ts +++ /dev/null @@ -1,19 +0,0 @@ -export async function deployERC20() { - const signer = (await locklift.keystore.getSigner("0"))!; - const { contract: token, tx } = await locklift.factory.deployContract({ - contract: "ERC20", - publicKey: signer.publicKey, - initParams: { - _nonce: locklift.utils.getRandomNonce(), - }, - constructorParams: { - _name: "TEST", - _symbol: "TEST", - _decimals: 18, - _count: 100 * 10 ^ 18 - }, - value: locklift.utils.toNano(3), - }); - console.log(`ERC20 token deployed at: ${token.address.toString()}`); - } - \ No newline at end of file diff --git a/scripts/2-deploy-asset.ts b/scripts/2-deploy-asset.ts deleted file mode 100644 index 97a77d4..0000000 --- a/scripts/2-deploy-asset.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Address } from "everscale-inpage-provider"; -export async function deployAsset() { - const signer = (await locklift.keystore.getSigner("0"))!; - const zeroAddress = new Address("0:0000000000000000000000000000000000000000000000000000000000000000"); - const { contract: mito, tx } = await locklift.factory.deployContract({ - contract: "ERC20Burnable", - publicKey: signer.publicKey, - initParams: { - _nonce: locklift.utils.getRandomNonce(), - }, - constructorParams: { - _name: "MITO", - _symbol: "MITO", - _decimals: 18, - _start_count: 100 * 10 ^ 18, - _auditor: zeroAddress - }, - value: locklift.utils.toNano(3), - }); - - console.log(`Mito token deployed at: ${mito.address.toString()}`); - } - diff --git a/scripts/5-deploy-all.ts b/scripts/5-deploy-all.ts deleted file mode 100644 index 2178e32..0000000 --- a/scripts/5-deploy-all.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { deployERC20 } from "./1-deploy-erc20"; -import { deployAsset } from "./2-deploy-asset" - -let contracts_function = [deployERC20, deployAsset] -function main() { - contracts_function.forEach(fun => { - fun().then(() => process.exit(0)) - .catch(e => { - console.log(e); - process.exit(1); - }); -}); -} - -main() diff --git a/story.md b/story.md new file mode 100644 index 0000000..b3000cc --- /dev/null +++ b/story.md @@ -0,0 +1,23 @@ +# Пример использования DAO-IPCI + +## Начало работы + +1. *Оператор* создаёт кошелек в сети Everscale. +2. *Оператор* создаёт свою DAO путём деплоя контракта AssetFactory. + + +## Добавление аудиторов + +*Оператор* добавляет в вайтлист (внутри AssetFactory addAuditor()) Аудиторов. + +## Выпуск нового токена + +1. *Пользователь* (обычный Wallet) оффчейн выбирает аудитора, просит аудитора создать токен. +2. *Пользователь* и *Аудитор* оффчейн договариваются о паратреах токена (начальная эмиссия, название токена, символ, decimals...). +3. *Аудитор* создаёт токен через фабрику (вызывает deployRoot() в контракте AssetFactory). +4. *Аудитор* переводит начальную эмиссию *Пользователю*. + +## Дальнейшие действия + +По мере того, как *Пользователь* производит зелёную энергию, он может договориться с *Аудитором* о пропорциональном выпуске +токенов на счёт *Пользователя*. \ No newline at end of file diff --git a/test/1-erc20acl-test.ts b/test/1-erc20acl-test.ts deleted file mode 100644 index e1089db..0000000 --- a/test/1-erc20acl-test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { expect } from "chai"; -import { Contract, Signer } from "locklift"; -import { FactorySource } from "../build/factorySource"; - -let factory: Contract; -let signer: Signer; - -describe("Test Sample contract", async function () { - before(async () => { - signer = (await locklift.keystore.getSigner("0"))!; - }); - describe("Contracts", async function () { - it("Deploy contract", async function () { - const token = await locklift.factory.getContractArtifacts('ERC20Burnable'); - const { contract } = await locklift.factory.deployContract({ - contract: "TokenFactory", - publicKey: signer.publicKey, - initParams: { - tokenCode_: token.code, - }, - constructorParams: {}, - value: locklift.utils.toNano(2), - }); - factory = contract; - - // expect(await locklift.provider.getBalance(sample.address).then(balance => Number(balance))).to.be.above(0); - console.log(`TokenFactory deployed at: ${factory.address.toString()}`); - console.log(`Factory owner: ${await factory.methods.getOwner({}).call()}`) - - }); - - // it("Interact with contract", async function () { - - // await sample.methods.setState({ _state: NEW_STATE }).sendExternal({ publicKey: signer.publicKey }); - - // const response = await sample.methods.getDetails({}).call(); - - // expect(Number(response._state)).to.be.equal(NEW_STATE, "Wrong state"); - // }); - }); -}); \ No newline at end of file diff --git a/test/1-tip3-test.ts b/test/1-tip3-test.ts new file mode 100644 index 0000000..da755c1 --- /dev/null +++ b/test/1-tip3-test.ts @@ -0,0 +1,67 @@ +import { expect } from "chai"; +import { Address, Contract, getRandomNonce, Signer } from "locklift"; +import { FactorySource } from "../build/factorySource"; + + +let signer: Signer; +let wallet: Contract; +let tokenRoot: Contract; + +describe("Test Sample contract", async function () { + before(async () => { + signer = (await locklift.keystore.getSigner("0"))!; + }); + describe("signer should deploy wallet", async function () { + it("Deploy contract", async function () { + const { contract } = await locklift.factory.deployContract({ + contract: "Wallet", + publicKey: signer.publicKey, + initParams: { + _randomNonce: getRandomNonce(), + }, + constructorParams: {}, + value: locklift.utils.toNano(100), + }); + wallet = contract; + + console.log(`Wallet address is: ${wallet.address}`); + console.log(`Wallet balance: ${await locklift.provider.getBalance(wallet.address)}`); + }); + + it("Should deploy TIP3 token", async function () { + const tokenWallet = locklift.factory.getContractArtifacts("TokenWallet"); + const { contract } = await locklift.factory.deployContract({ + contract: "TokenRoot", + publicKey: signer.publicKey, + initParams: { + name_: "TEST", + symbol_: "TST", + decimals_: 9, + rootOwner_: wallet.address, + walletCode_: tokenWallet.code, + randomNonce_: getRandomNonce(), + deployer_: new Address('0:0000000000000000000000000000000000000000000000000000000000000000'), + }, + constructorParams: { + initialSupplyTo: wallet.address, + initialSupply: 100 * 10 ** 9, + deployWalletValue: locklift.utils.toNano(0.1), + mintDisabled: false, + burnByRootDisabled: false, + burnPaused: false, + remainingGasTo: wallet.address + }, + value: locklift.utils.toNano(2), + }); + tokenRoot = contract; + console.log(`Token root deployed at: ${tokenRoot.address}`); + + const tokenWalletAddress = (await tokenRoot.methods.walletOf({answerId: 0, walletOwner: wallet.address}).call()).value0; + const TokenWallet = locklift.factory.getDeployedContract('TokenWalletUpgradeable', tokenWalletAddress); + + const {value0: tokenWalletBalance} = await TokenWallet.methods.balance({ answerId: 0 }).call(); + expect(Number(tokenWalletBalance)).to.equals(100 * 10 ** 9); + }); + + }); +}); \ No newline at end of file diff --git a/test/2-common-test.ts b/test/2-common-test.ts new file mode 100644 index 0000000..1338143 --- /dev/null +++ b/test/2-common-test.ts @@ -0,0 +1,136 @@ +import { expect } from "chai"; +import { Contract, Signer, getRandomNonce, Address } from "locklift"; +import { FactorySource } from "../build/factorySource"; +import { WalletV3Account} from "everscale-standalone-client/nodejs"; + + +let factory: Contract; +let operator: Signer; +let operatorWallet: WalletV3Account; +let auditor: Signer; +let auditorWallet: WalletV3Account; +let user: Signer; +let userWallet: WalletV3Account; +let token: Contract; +let userTokenWallet: Contract; + +const zeroAddress = new Address('0:0000000000000000000000000000000000000000000000000000000000000000'); + +describe("Prepare wallets", async function () { + before(async () => { + operator = (await locklift.keystore.getSigner("0"))!; + operatorWallet = await WalletV3Account.fromPubkey({publicKey: operator.publicKey, workchain: 0}); + await locklift.factory.accounts.storage.addAccount(operatorWallet); + await locklift.giver.sendTo(operatorWallet.address, locklift.utils.toNano(100)); + auditor = (await locklift.keystore.getSigner("1"))!; + auditorWallet = await WalletV3Account.fromPubkey({publicKey: auditor.publicKey, workchain: 0}); + await locklift.giver.sendTo(auditorWallet.address, locklift.utils.toNano(100)); + user = (await locklift.keystore.getSigner("3"))!; + userWallet = await WalletV3Account.fromPubkey({publicKey: user.publicKey, workchain: 0}); + await locklift.giver.sendTo(userWallet.address, locklift.utils.toNano(100)); +}); + describe("Test AssetFactory contract", async function () { + it("Operator should deploy his own DAO", async function () { + const tokenWallet = locklift.factory.getContractArtifacts("TokenWallet"); + const tokenRoot = locklift.factory.getContractArtifacts("TokenRoot"); + + const { contract: contract2} = await locklift.factory.deployContract({ + contract: "AssetFactory", + publicKey: operator.publicKey, + initParams: { + _randomNonce: getRandomNonce() + }, + constructorParams: { + owner: operatorWallet.address, + deployValue: locklift.utils.toNano(3), + rootCode: tokenRoot.code, + walletCode: tokenWallet.code, + rootUpgradeableCode: "", + walletUpgradeableCode: "", + platformCode: "" + }, + value: locklift.utils.toNano(10), + }); + + factory = contract2; + }); + + it("Operator should add auditor in DAO", async function () { + await locklift.factory.accounts.storage.addAccount(operatorWallet); + let tx1 = await factory.methods.addAuditor({auditor: auditorWallet.address}).send({ + from: operatorWallet.address, + amount: locklift.utils.toNano(1) + }); + + expect((await factory.methods.isAuditor({answerId: 0, auditor: auditorWallet.address}).call({})).value0).to.equals(true); + }); + + it("User should choose auditor and ask him to deploy token", async function () { + await locklift.factory.accounts.storage.addAccount(auditorWallet); + await locklift.giver.sendTo(factory.address, locklift.utils.toNano(100)); + let tx = await factory.methods.deployRoot({ + answerId: 0, + name: "TestAsset", + symbol: "TST", + decimals: 9, + owner: auditorWallet.address, + initialSupplyTo: userWallet.address, + initialSupply: 50 * 10 ** 9, + deployWalletValue: locklift.utils.toNano(0.2), + mintDisabled: false, + burnByRootDisabled: false, + burnPaused: false, + remainingGasTo: auditorWallet.address, + upgradeable: false + }).send({from: auditorWallet.address, amount: locklift.utils.toNano(4)}); + + let sub = new locklift.provider.Subscriber(); + let deploy_tx = await sub.trace(tx).filter(tx_in_tree => { + return tx_in_tree.account._address == factory.address.toString() + }).first(); + + let decoded_events = await factory.decodeTransactionEvents({ + transaction: deploy_tx!, + }); + + console.log(`Token root deployed at ${decoded_events[0].data.root}`); + const tokenRoot = locklift.factory.getDeployedContract("TokenRoot", decoded_events[0].data.root); + token = tokenRoot; + const tokenWalletAddress = (await tokenRoot.methods.walletOf({answerId: 0, walletOwner: userWallet.address}).call()).value0; + const TokenWallet = locklift.factory.getDeployedContract('TokenWallet', tokenWalletAddress); + userTokenWallet = TokenWallet; + + const {value0: tokenWalletBalance} = await userTokenWallet.methods.balance({ answerId: 0 }).call(); + console.log(`User token balance is ${tokenWalletBalance}`); + expect(Number(tokenWalletBalance)).to.equals(50 * 10 ** 9); + }); + it("User may ask auditor to mint some tokens", async function () { + let tx = await token.methods.mint({ + amount: 10 * 10 ** 9, + recipient: userWallet.address, + deployWalletValue: 0, + remainingGasTo: auditorWallet.address, + notify: false, + payload: "" + }).send({from: auditorWallet.address, amount: locklift.utils.toNano(1)}); + + const {value0: tokenWalletBalance} = await userTokenWallet.methods.balance({ answerId: 0 }).call(); + console.log(`User token balance is ${tokenWalletBalance}`); + expect(Number(tokenWalletBalance)).to.equals(60 * 10 ** 9); + }); + + it("User may burn sume tokens", async function () { + await locklift.factory.accounts.storage.addAccount(userWallet); + let tx = await userTokenWallet.methods.burn({ + amount: 15 * 10 ** 9, + remainingGasTo: userWallet.address, + callbackTo: zeroAddress, + payload: "" + }).send({from: userWallet.address, amount: locklift.utils.toNano(1)}); + + const {value0: tokenWalletBalance} = await userTokenWallet.methods.balance({ answerId: 0 }).call(); + console.log(`User token balance is ${tokenWalletBalance}`); + expect(Number(tokenWalletBalance)).to.equals(45 * 10 ** 9); + }) + }); +});