diff --git a/miniserver/.env.example b/miniserver/.env.example index b8d9bfc..9a99841 100644 --- a/miniserver/.env.example +++ b/miniserver/.env.example @@ -46,7 +46,7 @@ POLLING_INTERVAL=1000 DEFAULT_NETWORK='eth-local' GAS_LIMIT='67219000' #GAS_PRICE='10000000' -GAS_PRICE='413290302' +GAS_PRICE='529942254' CACHE='cache' STATS_PATH='../data/stats.json' OTP_INTERVAL=60000 diff --git a/miniserver/abi/MiniProxy.json b/miniserver/abi/MiniProxy.json new file mode 100644 index 0000000..ecbf663 --- /dev/null +++ b/miniserver/abi/MiniProxy.json @@ -0,0 +1,84 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "impl", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] diff --git a/miniserver/abi/MiniWallet.json b/miniserver/abi/MiniWallet.json index 05dd163..f1ce3ab 100644 --- a/miniserver/abi/MiniWallet.json +++ b/miniserver/abi/MiniWallet.json @@ -1043,4 +1043,4 @@ "stateMutability": "nonpayable", "type": "function" } -], \ No newline at end of file +] diff --git a/miniserver/blockchain.js b/miniserver/blockchain.js index cdad84b..8411134 100644 --- a/miniserver/blockchain.js +++ b/miniserver/blockchain.js @@ -25,7 +25,7 @@ const init = async () => { Logger.log('Initializing blockchain for server') Logger.log(`network=${config.defaultNetwork}, ${JSON.stringify(networkConfig)}`) provider = ethers.getDefaultProvider(networkConfig.url) - miniWallet = new ethers.Contract(networkConfig.miniWalletAddress, MiniWallet.abi, provider) + miniWallet = new ethers.Contract(networkConfig.miniWalletAddress, MiniWallet, provider) provider.pollingInterval = config.pollingInterval signers.splice(0, signers.length) if (networkConfig.mnemonic) { @@ -72,11 +72,14 @@ const sampleExecutionAddress = () => { // basic executor used to send funds const prepareExecute = (logger = Logger.log, abortUnlessRPCError = true) => async (method, ...params) => { + console.log(`method: ${method}`) + console.log(`params: ${JSON.stringify(params)}`) const fromIndex = sampleExecutionAddress() const from = signers[fromIndex].address const miniWalletSigner = miniWallet.connect(signers[fromIndex]) logger(`Sampled [${fromIndex}] ${from}`) const latestNonce = await rpc.getNonce({ address: from, network: config.defaultNetwork }) + const gasPrice = await provider.getGasPrice() const snapshotPendingNonces = pendingNonces[from] const nonce = latestNonce + snapshotPendingNonces pendingNonces[from] += 1 @@ -89,7 +92,7 @@ const prepareExecute = (logger = Logger.log, abortUnlessRPCError = true) => asyn const tx = await backOff( async () => miniWalletSigner[method](...params, { nonce, - gasPrice: ethers.BigNumber.from(config.gasPrice).mul((numAttempts || 0) + 1), + gasPrice: gasPrice.mul((numAttempts || 0) + 1), value: 0, }), { retry: (ex, n) => { diff --git a/miniserver/routes/index.js b/miniserver/routes/index.js index 39e7720..cb5262e 100644 --- a/miniserver/routes/index.js +++ b/miniserver/routes/index.js @@ -39,47 +39,47 @@ const parseSMS = async (req, res, next) => { res.status(status).send(response.toString()) } try { - const u = await User.findByPhone({ phone: senderPhoneNumber }) - if (!u) { + const { address: fromAddress } = (await User.findByPhone({ phone: senderPhoneNumber })) || {} + if (!fromAddress) { return respond('You are not registered. Signup at https://smswallet.xyz') } if (smsParams.length < 1) { return respond('error: empty sms command') } if (smsParams[0] === 'b') { - req.processedBody = { ...req.processedBody, command: 'balance', fromAddress: u.address } + req.processedBody = { ...req.processedBody, command: 'balance', fromAddress } return next() } if (smsParams[0] === 'p') { if (smsParams.length < 2) { - return respond('error: pay request requires funder and an amount. example request "p +14158401999 0.1"') + return respond('error: pay request requires recipient and an amount. example request "p +16505473175 0.1"') } if (!(toNumber(smsParams[2]) > 0)) { - return respond(`error: pay request requires a valid amount': ${smsParams[2]} example request "p +14158401999 0.1"`) + return respond(`error: pay request requires a valid amount': ${smsParams[2]} example request "p +116505473175 0.1"`) } const amount = ethers.utils.parseEther(smsParams[2]) let toAddress - // Allow requesting of funds from users by address (without checking registered phone number) + // Allow sending of funds to users by address (without checking registered phone number) if (smsParams[1].substr(0, 2) === '0x') { if (!isValidAddress(smsParams[1])) { - return respond(`error: invalid funder address ${smsParams[1]}. example request "p 0x8ba1f109551bd432803012645ac136ddd64dba72 0.1"`) + return respond(`error: invalid recipient address ${smsParams[1]}. example request "p 0x58bB8c7D2c90dF970fb01a5cD29c4075C41d3FFB 0.1"`) } toAddress = checkSumAddress(smsParams[1]) } else { const { isValid, phoneNumber } = phone(smsParams[1], smsParams[1] === '+' ? undefined : phone(u.phone).countryIso3) if (!isValid) { - return respond(`error: invalid recipient phone number ${smsParams[1]}. example request "p +14158401999 0.1"`) + return respond(`error: invalid recipient phone number ${smsParams[1]}. example request "p +16505473175 0.1"`) } const u2 = await User.findByPhone({ phone: phoneNumber }) if (!u2?.address) { - return respond(`error: funders phone number is not a registered wallet: ${smsParams[1]}. example request "p +14158401999 0.1"`) + return respond(`error: recipients phone number is not a registered wallet: ${smsParams[1]}. example request "p +16505473175 0.1"`) } toAddress = u2.address } - req.processedBody = { ...req.processedBody, command: 'pay', fromAddress: u.address, toAddress, amount } + req.processedBody = { ...req.processedBody, command: 'pay', fromAddress, toAddress, amount } return next() } - return respond('error: invalid sms command. example payment request "p +14158401999 0.1"') + return respond('error: invalid sms command. example payment request "p +16505473175 0.1"') } catch (ex) { console.error(ex) return respond('An unexpected occurred. Please contact support.') diff --git a/miniwallet/.env.example b/miniwallet/.env.example index ef738f3..fe6667c 100644 --- a/miniwallet/.env.example +++ b/miniwallet/.env.example @@ -19,9 +19,16 @@ MINIWALLET_INITIAL_OPERATORS=["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266","0x70 MINIWALLET_INITIAL_USER_LIMIT=1000000 MINIWALLET_INITIAL_AUTH_LIMIT=100000 -# Smart Contract Testing config +# Smart Contract ethlocal config ## MiniWallet -TEST_MINIWALLET_INITIAL_OPERATOR_THRESHOLD=10 -TEST_MINIWALLET_INITIAL_OPERATORS=["0x70997970C51812dc3A010C7d01b50e0d17dc79C8","0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC","0x90F79bf6EB2c4f870365E785982E1f101E93b906"] -TEST_MINIWALLET_INITIAL_USER_LIMIT=1000 -TEST_MINIWALLET_INITIAL_AUTH_LIMIT=100 +ETH_LOCAL_MINIWALLET_INITIAL_OPERATOR_THRESHOLD=10 +ETH_LOCAL_MINIWALLET_INITIAL_OPERATORS=["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266","0x70997970C51812dc3A010C7d01b50e0d17dc79C8","0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC","0x90F79bf6EB2c4f870365E785982E1f101E93b906"] +ETH_LOCAL_MINIWALLET_INITIAL_USER_LIMIT=1000 +ETH_LOCAL_MINIWALLET_INITIAL_AUTH_LIMIT=100 + +# Smart Contract hardhat config (used for testing e.g. in `yarn test`) +## MiniWallet +HARDHAT_MINIWALLET_INITIAL_OPERATOR_THRESHOLD=10 +HARDHAT_MINIWALLET_INITIAL_OPERATORS=["0x70997970C51812dc3A010C7d01b50e0d17dc79C8","0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC","0x90F79bf6EB2c4f870365E785982E1f101E93b906"] +HARDHAT_MINIWALLET_INITIAL_USER_LIMIT=1000 +HARDHAT_MINIWALLET_INITIAL_AUTH_LIMIT=100 \ No newline at end of file diff --git a/miniwallet/config.test.ts b/miniwallet/config.test.ts index a1fe8de..645131c 100644 --- a/miniwallet/config.test.ts +++ b/miniwallet/config.test.ts @@ -3,14 +3,11 @@ import 'dotenv/config' export default { test: { - operator: JSON.parse(process.env.TEST_MINIWALLET_INITIAL_OPERATORS || '[]')[0] || '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', - user: process.env.TEST_USER || '0xEf4634BdBc6F6528EacB49278d7E17BCB9e2689A', - creator: process.env.TEST_CREATOR || '0x1cf6490889A92371fdBC610C4A862061F28BaFfA', miniWallet: { - initialOperatorThreshold: process.env.TEST_MINIWALLET_INITIAL_OPERATOR_THRESHOLD, - initialOperators: JSON.parse(process.env.TEST_MINIWALLET_INITIAL_OPERATORS || '[]'), - initialUserLimit: ethers.utils.parseEther(process.env.TEST_MINIWALLET_INIITIAL_USER_LIMIT || '1000'), - initialAuthLimit: ethers.utils.parseEther(process.env.TEST_MINIWALLET_INIITIAL_AUTH_LIMIT || '100') + initialOperatorThreshold: process.env.HARDHAT_MINIWALLET_INITIAL_OPERATOR_THRESHOLD || '10', + initialOperators: JSON.parse(process.env.HARDHAT_MINIWALLET_INITIAL_OPERATORS || '[]'), + initialUserLimit: ethers.utils.parseEther(process.env.HARDHAT_MINIWALLET_INIITIAL_USER_LIMIT || '1000'), + initialAuthLimit: ethers.utils.parseEther(process.env.HARDHAT_MINIWALLET_INIITIAL_AUTH_LIMIT || '100') } } } diff --git a/miniwallet/config.ts b/miniwallet/config.ts index c726339..5bb5727 100644 --- a/miniwallet/config.ts +++ b/miniwallet/config.ts @@ -4,10 +4,26 @@ import 'dotenv/config' export default { mainnet: { miniWallet: { - initialOperatorThreshold: process.env.MINIWALLET_INITIAL_OPERATOR_THRESHOLD, + initialOperatorThreshold: process.env.MINIWALLET_INITIAL_OPERATOR_THRESHOLD || '100', initialOperators: JSON.parse(process.env.MINIWALLET_INITIAL_OPERATORS || '[]'), initialUserLimit: ethers.utils.parseEther(process.env.MINIWALLET_INIITIAL_USER_LIMIT || '1000000'), initialAuthLimit: ethers.utils.parseEther(process.env.MINIWALLET_INIITIAL_AUTH_LIMIT || '100000') } + }, + ethlocal: { + miniWallet: { + initialOperatorThreshold: process.env.ETH_LOCAL_MINIWALLET_INITIAL_OPERATOR_THRESHOLD || '10', + initialOperators: JSON.parse(process.env.ETH_LOCAL_MINIWALLET_INITIAL_OPERATORS || '[]'), + initialUserLimit: ethers.utils.parseEther(process.env.ETH_LOCAL_MINIWALLET_INIITIAL_USER_LIMIT || '1000'), + initialAuthLimit: ethers.utils.parseEther(process.env.ETH_LOCAL_MINIWALLET_INIITIAL_AUTH_LIMIT || '100') + } + }, + hardhat: { + miniWallet: { + initialOperatorThreshold: process.env.HARDHAT_MINIWALLET_INITIAL_OPERATOR_THRESHOLD || '10', + initialOperators: JSON.parse(process.env.HARDHAT_MINIWALLET_INITIAL_OPERATORS || '[]'), + initialUserLimit: ethers.utils.parseEther(process.env.HARDHAT_MINIWALLET_INIITIAL_USER_LIMIT || '1000'), + initialAuthLimit: ethers.utils.parseEther(process.env.HARDHAT_MINIWALLET_INIITIAL_AUTH_LIMIT || '100') + } } } diff --git a/miniwallet/contracts/mocks/TestERC1155.sol b/miniwallet/contracts/mocks/TestERC1155.sol new file mode 100644 index 0000000..a85c3c9 --- /dev/null +++ b/miniwallet/contracts/mocks/TestERC1155.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/// @custom:security-contact dev@modulo.so +contract TestERC1155 is ERC1155, AccessControl { + bytes32 public constant URI_SETTER_ROLE = keccak256("URI_SETTER_ROLE"); + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + + constructor(uint256[] memory tokenIds, uint256[] memory amounts) + ERC1155("") + { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(URI_SETTER_ROLE, msg.sender); + _grantRole(MINTER_ROLE, msg.sender); + for (uint32 i = 0; i < tokenIds.length; i++) { + mint(msg.sender, tokenIds[i], amounts[i], ""); + } + } + + function setURI(string memory newuri) public onlyRole(URI_SETTER_ROLE) { + _setURI(newuri); + } + + function mint( + address account, + uint256 id, + uint256 amount, + bytes memory data + ) public onlyRole(MINTER_ROLE) { + _mint(account, id, amount, data); + } + + function mintBatch( + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) public onlyRole(MINTER_ROLE) { + _mintBatch(to, ids, amounts, data); + } + + // The following functions are overrides required by Solidity. + + function supportsInterface(bytes4 interfaceId) + public + view + override(ERC1155, AccessControl) + returns (bool) + { + return (ERC1155.supportsInterface(interfaceId) || + AccessControl.supportsInterface(interfaceId)); + } +} diff --git a/miniwallet/contracts/mocks/TestERC20.sol b/miniwallet/contracts/mocks/TestERC20.sol new file mode 100644 index 0000000..aa98737 --- /dev/null +++ b/miniwallet/contracts/mocks/TestERC20.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/// @custom:security-contact dev@modulo.so +contract TestERC20 is ERC20, AccessControl { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + + constructor(uint256 _amount) ERC20("TestERC20", "T20") { + _mint(msg.sender, _amount * 10**decimals()); + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(MINTER_ROLE, msg.sender); + } + + function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { + _mint(to, amount); + } +} diff --git a/miniwallet/contracts/mocks/TestERC721.sol b/miniwallet/contracts/mocks/TestERC721.sol new file mode 100644 index 0000000..d0620ad --- /dev/null +++ b/miniwallet/contracts/mocks/TestERC721.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Counters.sol"; + +/// @custom:security-contact dev@modulo.so +contract TestERC721 is ERC721, AccessControl { + using Counters for Counters.Counter; + + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + Counters.Counter private _tokenIdCounter; + + constructor(uint256 _amount) ERC721("TestERC721", "T721") { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(MINTER_ROLE, msg.sender); + for (uint32 i = 0; i < _amount; i++) { + safeMint(msg.sender); + } + } + + function _baseURI() internal pure override returns (string memory) { + return ""; + } + + function safeMint(address to) public onlyRole(MINTER_ROLE) { + uint256 tokenId = _tokenIdCounter.current(); + _tokenIdCounter.increment(); + _safeMint(to, tokenId); + } + + // The following functions are overrides required by Solidity. + + function supportsInterface(bytes4 interfaceId) + public + view + override(ERC721, AccessControl) + returns (bool) + { + return (ERC721.supportsInterface(interfaceId) || + AccessControl.supportsInterface(interfaceId)); + } +} diff --git a/miniwallet/contracts/mocks/TestTokens.sol b/miniwallet/contracts/mocks/TestTokens.sol deleted file mode 100644 index dca3c9c..0000000 --- a/miniwallet/contracts/mocks/TestTokens.sol +++ /dev/null @@ -1,168 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -pragma solidity ^0.8.9; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; - -contract TestERC20 is ERC20 { - string constant NAME = "Test20"; - string constant SYMBOL = "T20"; - address admin; - - constructor(uint256 _amount) ERC20(NAME, SYMBOL) { - admin = msg.sender; - _mint(msg.sender, _amount); - } - - modifier isAdmin() { - require(msg.sender == admin, "Only admin can do this"); - _; - } - - function mint(address dest, uint256 amount) public isAdmin { - ERC20._mint(dest, amount); - } - - function burn(address dest, uint256 amount) public isAdmin { - ERC20._burn(dest, amount); - } -} - -contract TestERC20Decimals9 is ERC20 { - string constant NAME = "Test20_D9"; - string constant SYMBOL = "T20D9"; - address admin; - - constructor(uint256 _amount) ERC20(NAME, SYMBOL) { - admin = msg.sender; - _mint(msg.sender, _amount); - } - - modifier isAdmin() { - require(msg.sender == admin, "Only admin can do this"); - _; - } - - function mint(address dest, uint256 amount) public isAdmin { - ERC20._mint(dest, amount); - } - - function burn(address dest, uint256 amount) public isAdmin { - ERC20._burn(dest, amount); - } - - function decimals() public pure override returns (uint8) { - return 9; - } -} - -contract TestERC721 is ERC721 { - string constant NAME = "Test721"; - string constant SYMBOL = "T721"; - address admin; - mapping(uint256 => string) uris; - - constructor(uint256[] memory tokenIds, string[] memory uris_) - ERC721(NAME, SYMBOL) - { - admin = msg.sender; - for (uint32 i = 0; i < tokenIds.length; i++) { - ERC721._mint(msg.sender, tokenIds[i]); - uris[tokenIds[i]] = uris_[i]; - } - } - - modifier isAdmin() { - require(msg.sender == admin, "Only admin can do this"); - _; - } - - function mint(address dest, uint256 tokenId) external isAdmin { - ERC721._mint(dest, tokenId); - } - - function burn(uint256 tokenId) external isAdmin { - ERC721._burn(tokenId); - } - - function setTokenUri(uint256 tokenId, string memory uri) external isAdmin { - uris[tokenId] = uri; - } - - function tokenURI(uint256 tokenId) - public - view - override - returns (string memory) - { - return uris[tokenId]; - } -} - -contract TestERC1155 is ERC1155 { - address admin; - mapping(uint256 => string) metadataUris; - - constructor( - uint256[] memory tokenIds, - uint256[] memory amounts, - string[] memory uris_ - ) ERC1155("") { - admin = msg.sender; - for (uint32 i = 0; i < tokenIds.length; i++) { - ERC1155._mint(msg.sender, tokenIds[i], amounts[i], ""); - metadataUris[tokenIds[i]] = uris_[i]; - } - } - - modifier isAdmin() { - require(msg.sender == admin, "Only admin can do this"); - _; - } - - function mint( - uint256 tokenId, - uint256 amount, - address dest, - string memory metadataUri - ) public isAdmin { - ERC1155._mint(dest, tokenId, amount, ""); - metadataUris[tokenId] = metadataUri; - } - - function payToMint( - uint256 tokenId, - uint256 amount, - address dest, - string memory metadataUri - ) external payable { - require(msg.value >= (amount * 1 ether), "Insufficient payment"); - uint256 excess = msg.value - (amount * 1 ether); - if (excess > 0) { - (bool success, bytes memory data) = msg.sender.call{value: excess}( - "" - ); - if (!success) revert(string(data)); - } - ERC1155._mint(dest, tokenId, amount, ""); - metadataUris[tokenId] = metadataUri; - } - - function setUri(uint256 id, string memory uri_) public isAdmin { - metadataUris[id] = uri_; - } - - function uri(uint256 id) public view override returns (string memory) { - return metadataUris[id]; - } - - function burn( - address dest, - uint256 tokenId, - uint256 amount - ) public isAdmin { - ERC1155._burn(dest, tokenId, amount); - } -} diff --git a/miniwallet/contracts/proxy/MiniProxy.sol b/miniwallet/contracts/proxy/MiniProxy.sol index cd87602..1702e57 100644 --- a/miniwallet/contracts/proxy/MiniProxy.sol +++ b/miniwallet/contracts/proxy/MiniProxy.sol @@ -28,6 +28,13 @@ contract MiniProxy is Proxy, ERC1967Upgrade { _upgradeToAndCall(_logic, _data, false); } + /** + * @dev Returns the current implementation address. + */ + function implementation() public view returns (address impl) { + return _implementation(); + } + /** * @dev Returns the current implementation address. */ diff --git a/miniwallet/devlog/FEATURE_ROLLOUT.md b/miniwallet/devlog/FEATURE_ROLLOUT.md index 646c029..979c2bd 100644 --- a/miniwallet/devlog/FEATURE_ROLLOUT.md +++ b/miniwallet/devlog/FEATURE_ROLLOUT.md @@ -12,7 +12,7 @@ This section gives an overview of the features and github branches and pull requ **Issues** -- MiniWallet - Launch Task List [#13](https://github.com/polymorpher/sms-wallet/issues/13)] has been used to track work streams open PR's and completed Items. It also has some development logs and status updates. +- MiniWallet - Launch Task List [#13](https://github.com/polymorpher/sms-wallet/issues/13) has been used to track work streams open PR's and completed Items. It also has some development logs and status updates. **Pull Requests** @@ -47,7 +47,7 @@ These are ready for merge - MiniWallet Server: Allows users and creators to check their balances. Allows creators to request operators to send approved funds from users. - MiniWallet Tests: Coverage of all MiniWallet features. -**Branch and commits** +**Branch and commits v0** - Branch is [ws-miniwallet-v0](https://github.com/polymorpher/sms-wallet/tree/ws-miniwallet-v0) - Commits @@ -55,18 +55,28 @@ These are ready for merge - Copying of devlog [commit 6b246cb](https://github.com/polymorpher/sms-wallet/commit/6b246cb6fb09ff4d088e0f955a0cb1430dcf100a) - ignore deployments folder [commit 6da449f](https://github.com/polymorpher/sms-wallet/commit/6da449f3e90797e473b9131f7a7870fd2c779892) - Pruning of MiniId and MiniNFTs [commit 959ae0f](https://github.com/polymorpher/sms-wallet/commit/959ae0f650014cfc014e9db72403da0241fa6e19) - - Adding in Proxy Changes [commit]() - - Additional cleanup [commit]() + +**Branch and commits v0.1** +- Branch is [ws-miniwallet-v0.1](https://github.com/polymorpher/sms-wallet/tree/ws-miniwallet-v0.1) +- Pull Request is [ws-miniwallet-v0.1 MiniWallet Functionality](https://github.com/polymorpher/sms-wallet/pull/17) +- Commit Summary + - Ensure MiniWallet and MiniServer can be validated against ethLocal + - Update config so testing and deploy work on hardhat + - Improve Proxy based on Feedback and ensure tests use Proxies + - Feeback on PR + - Automatic population of contract ABIs for miniserver + - Rewriting test contracts + - Removal of dummy URL's in test contrcts **Outstanding Items** * Replace Deployment with [native deployment](https://github.com/polymorpher/sms-wallet/blob/jw-proxy-tmp/miniwallet/deploy/001_deploy_miniWallet.ts) will allow us to remove the unnecessary population of [ADMIN_SLOT](https://github.com/polymorpher/sms-wallet/blob/jw-proxy-tmp/miniwallet/contracts/miniWallet/MiniWallet.sol#L377) -* Review MiniProxy.sol to ensure that we are happy with this UUPS compliant Proxy. If we decide to change the Proxy at a later point we will need to update contract addresses in miniserver and potentially other deployments. +* Review MiniProxy.sol to ensure that we are happy with this UUPS compliant proxy. If we decide to change the proxy at a later point we will need to update contract addresses in miniserver and potentially other deployments. **Future Work** -* mulit-call functionality for support of multiple transactions such as authorizations. -* [PROXY Enhancements](https://github.com/polymorpher/sms-wallet/blob/ws-miniwallet-v0/miniwallet/devlog/PROXY.md): Including Deterministic Deployments and Persistence of artifacts. -* Update Contract Testing to test administrative functions and what happens under different scenarios such as miniWallet paused. + +* Multi-call functionality for support of multiple transactions such as approvals. +* Update contract testing to include administrative functions and what happens under different scenarios such as miniWallet paused. **Refactor Notes** @@ -81,56 +91,77 @@ git push --set-upstream origin ws-miniwallet-v0 ``` ### mini-wallet deployment and upgrade scripts -These needs some improvement on fine-control over deploy and upgrade process (most likely can't just use simple hardhat calls / plugins anymore) and storing (not just logging) the addresses of proxy, logic, and storage + +There needs to be some improvement over the level of control on the deploy and upgrade processes. Most likely, we will be unable to simply just use hardhat calls or plugins. We should also store the addresses of proxy, logic contract, and storage slots, instead of merely logging them. **Key Features** +- Deterministic Deployments - For Proxy Contracts +- LightWeight Persistence of Artifacts +- Multichain/MultiContract Deployment Process + **Branch and commits** **Outstanding Items** +* [PROXY Enhancements](https://github.com/polymorpher/sms-wallet/blob/ws-miniwallet-v0/miniwallet/devlog/PROXY.md): Including Deterministic Deployments and Persistence of artifacts. +* [Configuration Enhancements](https://github.com/polymorpher/sms-wallet/blob/main/miniwallet/devlog/CONFIGURATION.md): ability to independently deploy (on multiple chains) and test each work stream. +* Parameterizing callData for tests +* Directly generating calldata using abi encoding similar to what is done in one-wallet lib + ### mini1155, 721, and related deployment scripts and tests -These need some sanitization and maybe some simplification on tests. They are pretty much ready for merge +There needs to be some sanitization and maybe some simplification on tests. It is ready for merging. **Key Features** -**Branch and commits** +* Airdropping NFT Collectibles by the operators using Mini721: these are NFT collections airdropped by Operators to each registered user. For the initial phase we will use minion images, and metadata attributes including tokenId, phone numbers, addresses, and country codes. -**Outstanding Items** +* Friends and Fans: these NFTs can be minted by MiniID NFT holders to friends and fans. There is an 1-to-1 correlation between MiniID tokenId and Mini1155 tokenId. A user may issue multiple Mini1155 tokens using the same token ID to any address. The functionality could be thought as a friends list. It may be used in events, where owners may issue these tokens ahead of the event, and burn them afterwards. The metadata attributes of these tokens could include token Id, phone numbers, addresses, and country codes. -### miniID related and other WIP stuff - -These are incomplete +* Creator NFT Collections: these are NFT collections (Mini721C) created by creators, which could have its own smart contract factory. For the initial phase, we will use minion images as the placeholder. -**Key Features** +* Creator Access Passes: these are NFT Access Passes (Mini1155C) sent to users by creators, which could have its own smart contract factory. **Branch and commits** +[TODO: this section is incomplete] + **Outstanding Items** -### documentations (NFTID.md, PROXY.md) +### miniID related and other WIP stuff -These need further review and some revision +[TODO: this section is incomplete] **Key Features** +MiniID: Soulbound Token (assigned to a phone number, cannot be transferred), 1 per phone number. +* Displayable as a QR Code which encapsulates information including TokenId, Phone, Address, Country. + **Branch and commits** +[TODO: this section is incomplete] + **Outstanding Items** +* [Signup Flow](https://github.com/polymorpher/sms-wallet/blob/main/miniwallet/devlog/NFTID.md#sign-up-flow) +* [Airdrop Flow](https://github.com/polymorpher/sms-wallet/blob/main/miniwallet/devlog/NFTID.md#airdrop-flow) +* QR Code Generation for displaying miniID in frontend UI +### Documentations (NFTID.md, PROXY.md) + +[TODO: this section is incomplete] # Deployment ## Infrastructure -For local testing you can use the following emulators +For local testing, one can use the following emulators * [Twilio](https://console.twilio.com/?frameUrl=%2Fconsole%3Fx-target-region%3Dus1) * [Google Cloud Datastore](https://console.cloud.google.com/datastore/entities;kind=nft_dev;ns=sms-wallet/query/kind?project=sms-wallet-00) -Typically when testing locally you can use the following tools with UI +One could also use the following tools which have frontend UIs. * [Metamask](chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/home.html) : Used to fund the sms-wallets from the admin account deployed with Ganache `0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266` * [sms-wallet](https://localhost:3100/): Used for user and creator frontend testing @@ -143,10 +174,8 @@ Typically when testing locally you can use the following tools with UI alias ganachem='ganache -m "test test test test test test test test test test test junk"' # twilio aliases -alias tmb='twilio api:core:messages:create --from "+14158401410" --to "+17372327333" --body "b"' -alias tmp='twilio api:core:messages:create --from "+16505473175" --to "+17372327333" --body "p 4158401410 0.1"' -alias tmps='twilio api:core:messages:create --from "+14158401410" --to "+17372327333" --body "p 4158401410 0.1"' -alias tmpbp='twilio api:core:messages:create --from "+14158401410" --to "+17372327333" --body "p 4158401999 0.1"' +alias tmb='twilio api:core:messages:create --from "+14158401410" --to "+1 +alias tmp='twilio api:core:messages:create --from "+14158401410" --to "+17372327333" --body "p 6505473175 0.1"' # one-wallet aliases alias cdo="cd /Users/john/one-wallet; pwd" @@ -169,11 +198,11 @@ alias gmu="git checkout master; git fetch upstream; git merge upstream/master; g ``` -## Launching the infrastructure +## Local deployment -If running this locally on a mac you can use a tool like iterm2 with separate windows for each instance. +Tips: tools such as iterm2 could be helpful for creating separate windows for each tool and each test process. -### gancache port:8545 +### gancache, port:8545 ``` cdos @@ -181,12 +210,14 @@ ganachem #deploy miniwallet (separate window) and check settings in .env (miniserver) cdos cd miniwallet -yarn deploy --network ethLocal +yarn deploy --network ethlocal ``` -### Reset metamask account and fund wallet +### MetaMask + +You could import testing accounts to MetaMask to manage the funds -### Google DataStore Locally port:9000 +### Google Datastore, port:9000 ``` # https://cloud.google.com/datastore/docs/tools/datastore-emulator#starting_the_emulator @@ -204,7 +235,7 @@ cd /Users/john/.config/gcloud/emulators/datastore rm -rf WEB-INF ``` -### sms-wallet miniserver http port:3101 https port:8444 +### sms-wallet miniserver, http port:3101 https port:8444 ``` cdos @@ -213,7 +244,7 @@ yarn debug ``` -### sms-wallet server http port:3000 https port:8443 +### sms-wallet server, http port:3000 https port:8443 ``` cdos @@ -221,7 +252,7 @@ cd server yarn debug ``` -### sms-wallet client https port: 3100 +### sms-wallet client, https port: 3100 ``` cdos @@ -229,7 +260,7 @@ cd client yarn debug ``` -### sms-wallet demo https: port 3099 +### sms-wallet demo, https: port 3099 ``` cdos @@ -237,14 +268,14 @@ cd demo cd yarn debug ``` -### ngrok allows inbound requests to local sms-server +### ngrok, allows inbound requests to local sms-server ``` cd /Applications ./ngrok http 3101 ``` -### twilio connect incoming messages to local server +### twilio, connect incoming messages to local server ``` cd /Applications @@ -253,7 +284,7 @@ twilio phone-numbers:update +17372327333 --sms-url https://04ac-2601-647-4701-35 ## Testing -Following is an overview of the tests usually done +Here is an overview of the tests usually performed during the development **Smart Contract Testing** @@ -265,16 +296,16 @@ Following is an overview of the tests usually done - Deploy all the local infrastucture [see above] -**End to End Testing** +**End-to-End Testing** -- `yarn deploy ethLocal` : Deploy all the contracts and mint test NFT's +- `yarn deploy ethlocal` : Deploy all the contracts and mint test NFT's - Reset metamask funding account -- Transfer 20 ETH from admin to sms-wallet user `0x143A933E79931006b3Eb89cBc938587546faF159` -- Transfer 20 ETH admin to sms-wallet creator `0x58bB8c7D2c90dF970fb01a5cD29c4075C41d3FFB` +- Transfer 40 ETH from admin to sms-wallet user `0x143A933E79931006b3Eb89cBc938587546faF159` - Transfer 5 ETH fROM user to creator - [user deposits 10 ETH and approves 1 ETH for creator](https://localhost:3100/call?amount=10&callback=aHR0cHM6Ly9sb2NhbGhvc3Q6MzA5OS9jYWxsYmFjaw%3D%3D&calldata=eyJtZXRob2QiOiJhcHByb3ZlKGFkZHJlc3MsdWludDI1NikiLCJwYXJhbWV0ZXJzIjpbeyJuYW1lIjoic3BlbmRlciIsInR5cGUiOiJhZGRyZXNzIiwidmFsdWUiOiIweDU4YkI4YzdEMmM5MGRGOTcwZmIwMWE1Y0QyOWM0MDc1QzQxZDNGRkIifSx7Im5hbWUiOiJhbW91bnQiLCJ0eXBlIjoidWludDI1NiIsInZhbHVlIjoiMTAwMDAwMDAwMDAwMDAwMDAwMCJ9XX0%3D&caller=Token%20Warrior&comment=Fund%20MiniWallet%2010%20ETH%20and%20approve%201%20ETH%20for%20creator%200x58bB8c7D2c90dF970fb01a5cD29c4075C41d3FFB&dest=0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512) - `tmb` checks users balance, responses can be viewed in the [twilio monitoring console](https://console.twilio.com/us1/monitor/logs/sms?frameUrl=%2Fconsole%2Fsms%2Flogs%3Fx-target-region%3Dus1¤tFrameUrl=%2Fconsole%2Fsms%2Flogs%3F__override_layout__%3Dembed%26bifrost%3Dtrue%26x-target-region%3Dus1) -- `tmp` creator requests the user to fund the user's mini wallet. The responses can be viewed in the [twilio monitoring console](https://console.twilio.com/us1/monitor/logs/sms?frameUrl=%2Fconsole%2Fsms%2Flogs%3Fx-target-region%3Dus1¤tFrameUrl=%2Fconsole%2Fsms%2Flogs%3F__override_layout__%3Dembed%26bifrost%3Dtrue%26x-target-region%3Dus1) +- `tmp` user sends funds to the creator from the user's mini wallet. The responses can be viewed in the [twilio monitoring console](https://console.twilio.com/us1/monitor/logs/sms?frameUrl=%2Fconsole%2Fsms%2Flogs%3Fx-target-region%3Dus1¤tFrameUrl=%2Fconsole%2Fsms%2Flogs%3F__override_layout__%3Dembed%26bifrost%3Dtrue%26x-target-region%3Dus1) +- Transfer 5 ETH from user to creator using the miniwallet - Add the miniID, mini721 and mini1155 tokens to both the user and creator UI (note: you can use the browser in separate sandboxes, one for the user, and another for the creator) diff --git a/miniwallet/hardhat.config.ts b/miniwallet/hardhat.config.ts index 2d4a521..7cf83ab 100644 --- a/miniwallet/hardhat.config.ts +++ b/miniwallet/hardhat.config.ts @@ -60,7 +60,7 @@ const hardhatUserconfig: HardhatUserConfig = { auto: true } }, - ethLocal: { + ethlocal: { url: process.env.ETH_LOCAL_URL, gasPrice: 20000000000, gas: 6000000, @@ -150,12 +150,13 @@ const hardhatUserconfig: HardhatUserConfig = { freshOutput: true }, abiExporter: { - path: './data/abi', + path: '../miniserver/abi', runOnCompile: true, clear: true, flat: true, - spacing: 2, - pretty: true + only: [':MiniWallet$', ':MiniProxy$'], + format: 'json', + spacing: 2 }, spdxLicenseIdentifier: { overwrite: true, diff --git a/miniwallet/test/admin.ts b/miniwallet/test/admin.ts index 8b779a6..1a1da62 100644 --- a/miniwallet/test/admin.ts +++ b/miniwallet/test/admin.ts @@ -13,10 +13,8 @@ const DEFAULT_ADMIN_ROLE = '0x00000000000000000000000000000000000000000000000000 describe('MiniWallet Admin', function () { before(async function () { await prepare(this, [ - 'MiniWallet', - 'TestERC20', - 'TestERC721', - 'TestERC1155' + 'MiniProxy', + 'MiniWallet' ]) }) diff --git a/miniwallet/test/approve.ts b/miniwallet/test/approve.ts index aefa6f9..c3d2bf0 100644 --- a/miniwallet/test/approve.ts +++ b/miniwallet/test/approve.ts @@ -14,10 +14,8 @@ const ONE_ETH = ethers.utils.parseEther('1') describe('MiniWallet', function () { before(async function () { await prepare(this, [ - 'MiniWallet', - 'TestERC20', - 'TestERC721', - 'TestERC1155' + 'MiniProxy', + 'MiniWallet' ]) }) diff --git a/miniwallet/test/deposit.ts b/miniwallet/test/deposit.ts index 3a9d289..e59c542 100644 --- a/miniwallet/test/deposit.ts +++ b/miniwallet/test/deposit.ts @@ -14,6 +14,7 @@ const ONE_ETH = ethers.utils.parseEther('1') describe('MiniWallet', function () { before(async function () { await prepare(this, [ + 'MiniProxy', 'MiniWallet' ]) }) diff --git a/miniwallet/test/extra.ts b/miniwallet/test/extra.ts index 65551f2..c1dc748 100644 --- a/miniwallet/test/extra.ts +++ b/miniwallet/test/extra.ts @@ -15,10 +15,8 @@ const INITIAL_BALANCE_ETH = ethers.utils.parseEther('10000') describe('MiniWallet', function () { before(async function () { await prepare(this, [ - 'MiniWallet', - 'TestERC20', - 'TestERC721', - 'TestERC1155' + 'MiniProxy', + 'MiniWallet' ]) }) diff --git a/miniwallet/test/send.ts b/miniwallet/test/send.ts index 0fac9d5..4dff4f7 100644 --- a/miniwallet/test/send.ts +++ b/miniwallet/test/send.ts @@ -14,6 +14,7 @@ const ONE_ETH = ethers.utils.parseEther('1') describe('MiniWallet', function () { before(async function () { await prepare(this, [ + 'MiniProxy', 'MiniWallet' ]) }) diff --git a/miniwallet/test/transfer.ts b/miniwallet/test/transfer.ts index 50cd29d..ac81002 100644 --- a/miniwallet/test/transfer.ts +++ b/miniwallet/test/transfer.ts @@ -19,6 +19,7 @@ const DUMMY_HEX = '0x' describe('MiniWallet', function () { before(async function () { await prepare(this, [ + 'MiniProxy', 'MiniWallet', 'TestERC20', 'TestERC721', @@ -79,7 +80,7 @@ describe('MiniWallet', function () { it('MW-transfer-1: positive test of ERC721 transfer', async function () { // Deploy 721 - await deploy(this, [['erc721', this.TestERC721, [range(10), range(10).map((e: any) => `ipfs://test721/${e}`)]]]) + await deploy(this, [['erc721', this.TestERC721, [10]]]) // Transfer some Tokens for Alice let tx = await this.erc721.transferFrom(this.deployer.address, this.alice.address, 0) await tx.wait() @@ -110,8 +111,7 @@ describe('MiniWallet', function () { // Deploy 1155 await deploy(this, [['erc1155', this.TestERC1155, [ range(10), - range(10).map((e: any) => 10), // mint 10 for each - range(10).map((e: any) => `ipfs://test1155/${e}`) + range(10).map((e: any) => 10) // mint 10 for each ]]]) // Transfer some tokens for Alice let tx = await this.erc1155.safeTransferFrom(this.deployer.address, this.alice.address, 0, 7, DUMMY_HEX) diff --git a/miniwallet/test/utilities/index.ts b/miniwallet/test/utilities/index.ts index 244514f..02afb39 100644 --- a/miniwallet/test/utilities/index.ts +++ b/miniwallet/test/utilities/index.ts @@ -32,11 +32,12 @@ export async function deploy (context, contracts) { export async function deployUpgradeable (testEnvironment, contracts) { for (const contract of contracts) { - testEnvironment[contract[0]] = await contract[1].deploy() - await testEnvironment[contract[0]].deployed() - const tx = await testEnvironment[contract[0]].initialize(...(contract[2] || [])) - await tx.wait() - // await ethers.provider.waitForTransaction(tx.hash) + const implementation = await contract[1].deploy() + await implementation.deployed() + const calldata = contract[1].interface.encodeFunctionData('initialize', contract[2] || []) + const proxy = await testEnvironment.MiniProxy.deploy(implementation.address, calldata) + await proxy.deployed() + testEnvironment[contract[0]] = testEnvironment.MiniWallet.attach(proxy.address) } } diff --git a/miniwallet/test/withdraw.ts b/miniwallet/test/withdraw.ts index 440105a..d79a100 100644 --- a/miniwallet/test/withdraw.ts +++ b/miniwallet/test/withdraw.ts @@ -14,6 +14,7 @@ const ONE_ETH = ethers.utils.parseEther('1') describe('MiniWallet', function () { before(async function () { await prepare(this, [ + 'MiniProxy', 'MiniWallet' ]) }) diff --git a/miniwallet/tsconfig.json b/miniwallet/tsconfig.json index 8d7c8d5..c0828c0 100644 --- a/miniwallet/tsconfig.json +++ b/miniwallet/tsconfig.json @@ -9,6 +9,6 @@ "resolveJsonModule": true, "noImplicitAny": false }, - "include": ["./scripts", "./test", "./deploy", "./typechain", "./hardhat.config.ts"], + "include": ["./scripts", "./test", "./deploy", "./typechain", "./hardhat.config.ts", "test/utilities/constants.ts"], "files": ["./hardhat.config.ts"] } diff --git a/server/yarn.lock b/server/yarn.lock index 264f31a..f4f83dc 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -598,21 +598,6 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/abstract-provider@5.6.1", "@ethersproject/abstract-provider@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" @@ -626,19 +611,6 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/web" "^5.6.1" -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - "@ethersproject/abstract-signer@5.6.2", "@ethersproject/abstract-signer@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" @@ -650,17 +622,6 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/address@5.6.1", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" @@ -672,17 +633,6 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.1" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/base64@5.6.1", "@ethersproject/base64@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" @@ -690,13 +640,6 @@ dependencies: "@ethersproject/bytes" "^5.6.1" -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/basex@5.6.1", "@ethersproject/basex@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305" @@ -705,14 +648,6 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/properties" "^5.6.0" -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/bignumber@5.6.2", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" @@ -722,15 +657,6 @@ "@ethersproject/logger" "^5.6.0" bn.js "^5.2.1" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - "@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" @@ -738,13 +664,6 @@ dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - "@ethersproject/constants@5.6.1", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" @@ -752,13 +671,6 @@ dependencies: "@ethersproject/bignumber" "^5.6.2" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/contracts@5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc" @@ -775,22 +687,6 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/transactions" "^5.6.2" -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/hash@5.6.1", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" @@ -805,21 +701,6 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/hdnode@5.6.2", "@ethersproject/hdnode@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2" @@ -838,24 +719,6 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/wordlists" "^5.6.1" -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - "@ethersproject/json-wallets@5.6.1", "@ethersproject/json-wallets@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91" @@ -875,25 +738,6 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - "@ethersproject/keccak256@5.6.1", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" @@ -902,24 +746,11 @@ "@ethersproject/bytes" "^5.6.1" js-sha3 "0.8.0" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - "@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - "@ethersproject/networks@5.6.4", "@ethersproject/networks@^5.6.3": version "5.6.4" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.4.tgz#51296d8fec59e9627554f5a8a9c7791248c8dc07" @@ -927,13 +758,6 @@ dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/networks@5.7.0", "@ethersproject/networks@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad" - integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA== - dependencies: - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2@5.6.1", "@ethersproject/pbkdf2@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz#f462fe320b22c0d6b1d72a9920a3963b09eb82d1" @@ -942,14 +766,6 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/sha2" "^5.6.1" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" @@ -957,13 +773,6 @@ dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - "@ethersproject/providers@5.6.8": version "5.6.8" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d" @@ -990,32 +799,6 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/providers@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.0.tgz#a885cfc7650a64385e7b03ac86fe9c2d4a9c2c63" - integrity sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - "@ethersproject/random@5.6.1", "@ethersproject/random@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255" @@ -1024,14 +807,6 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp@5.6.1", "@ethersproject/rlp@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" @@ -1040,14 +815,6 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2@5.6.1", "@ethersproject/sha2@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.1.tgz#211f14d3f5da5301c8972a8827770b6fd3e51656" @@ -1057,15 +824,6 @@ "@ethersproject/logger" "^5.6.0" hash.js "1.1.7" -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - hash.js "1.1.7" - "@ethersproject/signing-key@5.6.2", "@ethersproject/signing-key@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" @@ -1078,18 +836,6 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - "@ethersproject/solidity@5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.1.tgz#5845e71182c66d32e6ec5eefd041fca091a473e2" @@ -1102,18 +848,6 @@ "@ethersproject/sha2" "^5.6.1" "@ethersproject/strings" "^5.6.1" -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/strings@5.6.1", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" @@ -1123,15 +857,6 @@ "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/transactions@5.6.2", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" @@ -1147,21 +872,6 @@ "@ethersproject/rlp" "^5.6.1" "@ethersproject/signing-key" "^5.6.2" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/units@5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.1.tgz#ecc590d16d37c8f9ef4e89e2005bda7ddc6a4e6f" @@ -1171,15 +881,6 @@ "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/wallet@5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c" @@ -1201,27 +902,6 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/wordlists" "^5.6.1" -"@ethersproject/wallet@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/json-wallets" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - "@ethersproject/web@5.6.1", "@ethersproject/web@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" @@ -1233,17 +913,6 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" -"@ethersproject/web@5.7.0", "@ethersproject/web@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc" - integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/wordlists@5.6.1", "@ethersproject/wordlists@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1" @@ -1255,17 +924,6 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@google-cloud/datastore@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@google-cloud/datastore/-/datastore-7.0.0.tgz#e026db7d12c773230abf9e6b391a6196ef3fb81b" @@ -3970,42 +3628,6 @@ ethers@^5.0.13: "@ethersproject/web" "5.6.1" "@ethersproject/wordlists" "5.6.1" -ethers@^5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" - integrity sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.0" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.0" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.0" - "@ethersproject/wordlists" "5.7.0" - ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"