Unverified Commit ecc66719 by Nicolás Venturo Committed by GitHub

Add ERC20 Permit (EIP-2612) (#2237)

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
Co-authored-by: Santiago Palladino <spalladino@gmail.com>
parent 03d51c56
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* `BeaconProxy`: added new kind of proxy that allows simultaneous atomic upgrades. ([#2411](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2411)) * `BeaconProxy`: added new kind of proxy that allows simultaneous atomic upgrades. ([#2411](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2411))
* `EIP712`: added helpers to verify EIP712 typed data signatures on chain. ([#2418](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2418)) * `EIP712`: added helpers to verify EIP712 typed data signatures on chain. ([#2418](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2418))
* `ERC20Permit`: added an implementation of the ERC20 permit extension for gasless token approvals. ([#2237](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237))
* Presets: added token presets with preminted fixed supply `ERC20PresetFixedSupply` and `ERC777PresetFixedSupply`. ([#2399](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2399)) * Presets: added token presets with preminted fixed supply `ERC20PresetFixedSupply` and `ERC777PresetFixedSupply`. ([#2399](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2399))
* `Address`: added `functionDelegateCall`, similar to the existing `functionCall`. ([#2333](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2333)) * `Address`: added `functionDelegateCall`, similar to the existing `functionCall`. ([#2333](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2333))
......
...@@ -43,6 +43,14 @@ library ECDSA { ...@@ -43,6 +43,14 @@ library ECDSA {
v := byte(0, mload(add(signature, 0x60))) v := byte(0, mload(add(signature, 0x60)))
} }
return recover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
......
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.5 <0.8.0;
import "../token/ERC20/ERC20.sol";
import "./IERC20Permit.sol";
import "../cryptography/ECDSA.sol";
import "../utils/Counters.sol";
import "./EIP712.sol";
/**
* @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
using Counters for Counters.Counter;
mapping (address => Counters.Counter) private _nonces;
// solhint-disable-next-line var-name-mixedcase
bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
/**
* @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
*
* It's a good idea to use the same `name` that is defined as the ERC20 token name.
*/
constructor(string memory name) internal EIP712(name, "1") {
}
/**
* @dev See {IERC20Permit-permit}.
*/
function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {
// solhint-disable-next-line not-rely-on-time
require(block.timestamp <= deadline, "ERC20Permit: expired deadline");
bytes32 structHash = keccak256(
abi.encode(
_PERMIT_TYPEHASH,
owner,
spender,
amount,
_nonces[owner].current(),
deadline
)
);
bytes32 hash = _hashTypedDataV4(structHash);
address signer = ECDSA.recover(hash, v, r, s);
require(signer == owner, "ERC20Permit: invalid signature");
_nonces[owner].increment();
_approve(owner, spender, amount);
}
/**
* @dev See {IERC20Permit-nonces}.
*/
function nonces(address owner) public view override returns (uint256) {
return _nonces[owner].current();
}
/**
* @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view override returns (bytes32) {
return _domainSeparatorV4();
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens,
* given `owner`'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
= Draft EIPS = Draft EIPs
This directory contains implementations of EIPs that are still in Draft status. This directory contains implementations of EIPs that are still in Draft status.
...@@ -7,3 +7,9 @@ Due to their nature as drafts, the details of these contracts may change and we ...@@ -7,3 +7,9 @@ Due to their nature as drafts, the details of these contracts may change and we
== Cryptography == Cryptography
{{EIP712}} {{EIP712}}
== ERC 20
{{IERC20Permit}}
{{ERC20Permit}}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../drafts/ERC20Permit.sol";
contract ERC20PermitMock is ERC20Permit {
constructor (
string memory name,
string memory symbol,
address initialAccount,
uint256 initialBalance
) public payable ERC20(name, symbol) ERC20Permit(name) {
_mint(initialAccount, initialBalance);
}
function getChainId() external pure returns (uint256 chainId) {
// solhint-disable-next-line no-inline-assembly
assembly {
chainId := chainid()
}
}
}
...@@ -14,6 +14,7 @@ There a few core contracts that implement the behavior specified in the EIP: ...@@ -14,6 +14,7 @@ There a few core contracts that implement the behavior specified in the EIP:
Additionally there are multiple custom extensions, including: Additionally there are multiple custom extensions, including:
* {ERC20Permit}: gasless approval of tokens.
* {ERC20Snapshot}: efficient storage of past token balances to be later queried at any point in time. * {ERC20Snapshot}: efficient storage of past token balances to be later queried at any point in time.
* {ERC20Burnable}: destruction of own tokens. * {ERC20Burnable}: destruction of own tokens.
* {ERC20Capped}: enforcement of a cap to the total supply when minting tokens. * {ERC20Capped}: enforcement of a cap to the total supply when minting tokens.
...@@ -24,6 +25,11 @@ Finally, there are some utilities to interact with ERC20 contracts in various wa ...@@ -24,6 +25,11 @@ Finally, there are some utilities to interact with ERC20 contracts in various wa
* {SafeERC20}: a wrapper around the interface that eliminates the need to handle boolean return values. * {SafeERC20}: a wrapper around the interface that eliminates the need to handle boolean return values.
* {TokenTimelock}: hold tokens for a beneficiary until a specified time. * {TokenTimelock}: hold tokens for a beneficiary until a specified time.
The following related EIPs are in draft status and can be found in the drafts directory.
- {IERC20Permit}
- {ERC20Permit}
NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC20 (such as <<ERC20-_mint-address-uint256-,`_mint`>>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc20.adoc#Presets[ERC20 Presets] (such as {ERC20PresetMinterPauser}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts. NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC20 (such as <<ERC20-_mint-address-uint256-,`_mint`>>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc20.adoc#Presets[ERC20 Presets] (such as {ERC20PresetMinterPauser}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts.
== Core == Core
......
...@@ -2538,6 +2538,407 @@ ...@@ -2538,6 +2538,407 @@
"ethers": "^4.0.32", "ethers": "^4.0.32",
"source-map-support": "^0.5.19", "source-map-support": "^0.5.19",
"web3": "1.2.9" "web3": "1.2.9"
},
"dependencies": {
"@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"dev": true
},
"@types/node": {
"version": "10.17.48",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.48.tgz",
"integrity": "sha512-Agl6xbYP6FOMDeAsr3QVZ+g7Yzg0uhPHWx0j5g4LFdUBHVtqtU+gH660k/lCEe506jJLOGbEzsnqPDTZGJQLag==",
"dev": true
},
"bignumber.js": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
"integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==",
"dev": true
},
"cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
"dev": true,
"requires": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^3.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^4.1.0",
"responselike": "^1.0.2"
},
"dependencies": {
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true
}
}
},
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
"dev": true,
"requires": {
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.2",
"cacheable-request": "^6.0.0",
"decompress-response": "^3.3.0",
"duplexer3": "^0.1.4",
"get-stream": "^4.1.0",
"lowercase-keys": "^1.0.1",
"mimic-response": "^1.0.1",
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
}
},
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"dev": true
},
"normalize-url": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
"integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
"dev": true
},
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
"dev": true
},
"web3": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3/-/web3-1.2.9.tgz",
"integrity": "sha512-Mo5aBRm0JrcNpN/g4VOrDzudymfOnHRC3s2VarhYxRA8aWgF5rnhQ0ziySaugpic1gksbXPe105pUWyRqw8HUA==",
"dev": true,
"requires": {
"web3-bzz": "1.2.9",
"web3-core": "1.2.9",
"web3-eth": "1.2.9",
"web3-eth-personal": "1.2.9",
"web3-net": "1.2.9",
"web3-shh": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-bzz": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.9.tgz",
"integrity": "sha512-ogVQr9jHodu9HobARtvUSmWG22cv2EUQzlPeejGWZ7j5h20HX40EDuWyomGY5VclIj5DdLY76Tmq88RTf/6nxA==",
"dev": true,
"requires": {
"@types/node": "^10.12.18",
"got": "9.6.0",
"swarm-js": "^0.1.40",
"underscore": "1.9.1"
}
},
"web3-core": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.9.tgz",
"integrity": "sha512-fSYv21IP658Ty2wAuU9iqmW7V+75DOYMVZsDH/c14jcF/1VXnedOcxzxSj3vArsCvXZNe6XC5/wAuGZyQwR9RA==",
"dev": true,
"requires": {
"@types/bn.js": "^4.11.4",
"@types/node": "^12.6.1",
"bignumber.js": "^9.0.0",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-core-requestmanager": "1.2.9",
"web3-utils": "1.2.9"
},
"dependencies": {
"@types/node": {
"version": "12.19.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.8.tgz",
"integrity": "sha512-D4k2kNi0URNBxIRCb1khTnkWNHv8KSL1owPmS/K5e5t8B2GzMReY7AsJIY1BnP5KdlgC4rj9jk2IkDMasIE7xg==",
"dev": true
}
}
},
"web3-core-helpers": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.9.tgz",
"integrity": "sha512-t0WAG3orLCE3lqi77ZoSRNFok3VQWZXTniZigDQjyOJYMAX7BU3F3js8HKbjVnAxlX3tiKoDxI0KBk9F3AxYuw==",
"dev": true,
"requires": {
"underscore": "1.9.1",
"web3-eth-iban": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-core-method": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.9.tgz",
"integrity": "sha512-bjsIoqP3gs7A/gP8+QeLUCyOKJ8bopteCSNbCX36Pxk6TYfYWNuC6hP+2GzUuqdP3xaZNe+XEElQFUNpR3oyAg==",
"dev": true,
"requires": {
"@ethersproject/transactions": "^5.0.0-beta.135",
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9",
"web3-core-promievent": "1.2.9",
"web3-core-subscriptions": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-core-promievent": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.9.tgz",
"integrity": "sha512-0eAUA2zjgXTleSrnc1wdoKQPPIHU6KHf4fAscu4W9kKrR+mqP1KsjYrxY9wUyjNnXxfQ+5M29ipvbiaK8OqdOw==",
"dev": true,
"requires": {
"eventemitter3": "3.1.2"
}
},
"web3-core-requestmanager": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.9.tgz",
"integrity": "sha512-1PwKV2m46ALUnIN5VPPgjOj8yMLJhhqZYvYJE34hTN5SErOkwhzx5zScvo5MN7v7KyQGFnpVCZKKGCiEnDmtFA==",
"dev": true,
"requires": {
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9",
"web3-providers-http": "1.2.9",
"web3-providers-ipc": "1.2.9",
"web3-providers-ws": "1.2.9"
}
},
"web3-core-subscriptions": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.9.tgz",
"integrity": "sha512-Y48TvXPSPxEM33OmXjGVDMzTd0j8X0t2+sDw66haeBS8eYnrEzasWuBZZXDq0zNUsqyxItgBGDn+cszkgEnFqg==",
"dev": true,
"requires": {
"eventemitter3": "3.1.2",
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9"
}
},
"web3-eth": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.9.tgz",
"integrity": "sha512-sIKO4iE9FEBa/CYUd6GdPd7GXt/wISqxUd8PlIld6+hvMJj02lgO7Z7p5T9mZIJcIZJGvZX81ogx8oJ9yif+Ag==",
"dev": true,
"requires": {
"underscore": "1.9.1",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-core-subscriptions": "1.2.9",
"web3-eth-abi": "1.2.9",
"web3-eth-accounts": "1.2.9",
"web3-eth-contract": "1.2.9",
"web3-eth-ens": "1.2.9",
"web3-eth-iban": "1.2.9",
"web3-eth-personal": "1.2.9",
"web3-net": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-eth-accounts": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.9.tgz",
"integrity": "sha512-jkbDCZoA1qv53mFcRHCinoCsgg8WH+M0YUO1awxmqWXRmCRws1wW0TsuSQ14UThih5Dxolgl+e+aGWxG58LMwg==",
"dev": true,
"requires": {
"crypto-browserify": "3.12.0",
"eth-lib": "^0.2.8",
"ethereumjs-common": "^1.3.2",
"ethereumjs-tx": "^2.1.1",
"scrypt-js": "^3.0.1",
"underscore": "1.9.1",
"uuid": "3.3.2",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-eth-contract": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.9.tgz",
"integrity": "sha512-PYMvJf7EG/HyssUZa+pXrc8IB06K/YFfWYyW4R7ed3sab+9wWUys1TlWxBCBuiBXOokSAyM6H6P6/cKEx8FT8Q==",
"dev": true,
"requires": {
"@types/bn.js": "^4.11.4",
"underscore": "1.9.1",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-core-promievent": "1.2.9",
"web3-core-subscriptions": "1.2.9",
"web3-eth-abi": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-eth-ens": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.9.tgz",
"integrity": "sha512-kG4+ZRgZ8I1WYyOBGI8QVRHfUSbbJjvJAGA1AF/NOW7JXQ+x7gBGeJw6taDWJhSshMoEKWcsgvsiuoG4870YxQ==",
"dev": true,
"requires": {
"content-hash": "^2.5.2",
"eth-ens-namehash": "2.0.8",
"underscore": "1.9.1",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-promievent": "1.2.9",
"web3-eth-abi": "1.2.9",
"web3-eth-contract": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-eth-iban": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.9.tgz",
"integrity": "sha512-RtdVvJE0pyg9dHLy0GzDiqgnLnssSzfz/JYguhC1wsj9+Gnq1M6Diy3NixACWUAp6ty/zafyOaZnNQ+JuH9TjQ==",
"dev": true,
"requires": {
"bn.js": "4.11.8",
"web3-utils": "1.2.9"
},
"dependencies": {
"bn.js": {
"version": "4.11.8",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
"integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
"dev": true
}
}
},
"web3-eth-personal": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.9.tgz",
"integrity": "sha512-cFiNrktxZ1C/rIdJFzQTvFn3/0zcsR3a+Jf8Y3KxeQDHszQtosjLWptP7bsUmDwEh4hzh0Cy3KpOxlYBWB8bJQ==",
"dev": true,
"requires": {
"@types/node": "^12.6.1",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-net": "1.2.9",
"web3-utils": "1.2.9"
},
"dependencies": {
"@types/node": {
"version": "12.19.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.8.tgz",
"integrity": "sha512-D4k2kNi0URNBxIRCb1khTnkWNHv8KSL1owPmS/K5e5t8B2GzMReY7AsJIY1BnP5KdlgC4rj9jk2IkDMasIE7xg==",
"dev": true
}
}
},
"web3-net": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.9.tgz",
"integrity": "sha512-d2mTn8jPlg+SI2hTj2b32Qan6DmtU9ap/IUlJTeQbZQSkTLf0u9suW8Vjwyr4poJYXTurdSshE7OZsPNn30/ZA==",
"dev": true,
"requires": {
"web3-core": "1.2.9",
"web3-core-method": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-providers-http": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.9.tgz",
"integrity": "sha512-F956tCIj60Ttr0UvEHWFIhx+be3He8msoPzyA44/kfzzYoMAsCFRn5cf0zQG6al0znE75g6HlWVSN6s3yAh51A==",
"dev": true,
"requires": {
"web3-core-helpers": "1.2.9",
"xhr2-cookies": "1.1.0"
}
},
"web3-providers-ipc": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.9.tgz",
"integrity": "sha512-NQ8QnBleoHA2qTJlqoWu7EJAD/FR5uimf7Ielzk4Z2z+m+6UAuJdJMSuQNj+Umhz9L/Ys6vpS1vHx9NizFl+aQ==",
"dev": true,
"requires": {
"oboe": "2.1.4",
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9"
}
},
"web3-providers-ws": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.9.tgz",
"integrity": "sha512-6+UpvINeI//dglZoAKStUXqxDOXJy6Iitv2z3dbgInG4zb8tkYl/VBDL80UjUg3ZvzWG0g7EKY2nRPEpON2TFA==",
"dev": true,
"requires": {
"eventemitter3": "^4.0.0",
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9",
"websocket": "^1.0.31"
},
"dependencies": {
"eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"dev": true
}
}
},
"web3-shh": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.9.tgz",
"integrity": "sha512-PWa8b/EaxaMinFaxy6cV0i0EOi2M7a/ST+9k9nhyhCjVa2vzXuNoBNo2IUOmeZ0WP2UQB8ByJ2+p4htlJaDOjA==",
"dev": true,
"requires": {
"web3-core": "1.2.9",
"web3-core-method": "1.2.9",
"web3-core-subscriptions": "1.2.9",
"web3-net": "1.2.9"
}
}
} }
}, },
"@truffle/provider": { "@truffle/provider": {
...@@ -2549,6 +2950,405 @@ ...@@ -2549,6 +2950,405 @@
"@truffle/error": "^0.0.11", "@truffle/error": "^0.0.11",
"@truffle/interface-adapter": "^0.4.18", "@truffle/interface-adapter": "^0.4.18",
"web3": "1.2.9" "web3": "1.2.9"
},
"dependencies": {
"@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"dev": true
},
"@types/node": {
"version": "10.17.48",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.48.tgz",
"integrity": "sha512-Agl6xbYP6FOMDeAsr3QVZ+g7Yzg0uhPHWx0j5g4LFdUBHVtqtU+gH660k/lCEe506jJLOGbEzsnqPDTZGJQLag==",
"dev": true
},
"bignumber.js": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
"integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==",
"dev": true
},
"bn.js": {
"version": "4.11.8",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
"integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
"dev": true
},
"cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
"dev": true,
"requires": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^3.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^4.1.0",
"responselike": "^1.0.2"
},
"dependencies": {
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true
}
}
},
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
"dev": true,
"requires": {
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.2",
"cacheable-request": "^6.0.0",
"decompress-response": "^3.3.0",
"duplexer3": "^0.1.4",
"get-stream": "^4.1.0",
"lowercase-keys": "^1.0.1",
"mimic-response": "^1.0.1",
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
}
},
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"dev": true
},
"normalize-url": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
"integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
"dev": true
},
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
"dev": true
},
"web3": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3/-/web3-1.2.9.tgz",
"integrity": "sha512-Mo5aBRm0JrcNpN/g4VOrDzudymfOnHRC3s2VarhYxRA8aWgF5rnhQ0ziySaugpic1gksbXPe105pUWyRqw8HUA==",
"dev": true,
"requires": {
"web3-bzz": "1.2.9",
"web3-core": "1.2.9",
"web3-eth": "1.2.9",
"web3-eth-personal": "1.2.9",
"web3-net": "1.2.9",
"web3-shh": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-bzz": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.9.tgz",
"integrity": "sha512-ogVQr9jHodu9HobARtvUSmWG22cv2EUQzlPeejGWZ7j5h20HX40EDuWyomGY5VclIj5DdLY76Tmq88RTf/6nxA==",
"dev": true,
"requires": {
"@types/node": "^10.12.18",
"got": "9.6.0",
"swarm-js": "^0.1.40",
"underscore": "1.9.1"
}
},
"web3-core": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.9.tgz",
"integrity": "sha512-fSYv21IP658Ty2wAuU9iqmW7V+75DOYMVZsDH/c14jcF/1VXnedOcxzxSj3vArsCvXZNe6XC5/wAuGZyQwR9RA==",
"dev": true,
"requires": {
"@types/bn.js": "^4.11.4",
"@types/node": "^12.6.1",
"bignumber.js": "^9.0.0",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-core-requestmanager": "1.2.9",
"web3-utils": "1.2.9"
},
"dependencies": {
"@types/node": {
"version": "12.19.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.8.tgz",
"integrity": "sha512-D4k2kNi0URNBxIRCb1khTnkWNHv8KSL1owPmS/K5e5t8B2GzMReY7AsJIY1BnP5KdlgC4rj9jk2IkDMasIE7xg==",
"dev": true
}
}
},
"web3-core-helpers": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.9.tgz",
"integrity": "sha512-t0WAG3orLCE3lqi77ZoSRNFok3VQWZXTniZigDQjyOJYMAX7BU3F3js8HKbjVnAxlX3tiKoDxI0KBk9F3AxYuw==",
"dev": true,
"requires": {
"underscore": "1.9.1",
"web3-eth-iban": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-core-method": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.9.tgz",
"integrity": "sha512-bjsIoqP3gs7A/gP8+QeLUCyOKJ8bopteCSNbCX36Pxk6TYfYWNuC6hP+2GzUuqdP3xaZNe+XEElQFUNpR3oyAg==",
"dev": true,
"requires": {
"@ethersproject/transactions": "^5.0.0-beta.135",
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9",
"web3-core-promievent": "1.2.9",
"web3-core-subscriptions": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-core-promievent": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.9.tgz",
"integrity": "sha512-0eAUA2zjgXTleSrnc1wdoKQPPIHU6KHf4fAscu4W9kKrR+mqP1KsjYrxY9wUyjNnXxfQ+5M29ipvbiaK8OqdOw==",
"dev": true,
"requires": {
"eventemitter3": "3.1.2"
}
},
"web3-core-requestmanager": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.9.tgz",
"integrity": "sha512-1PwKV2m46ALUnIN5VPPgjOj8yMLJhhqZYvYJE34hTN5SErOkwhzx5zScvo5MN7v7KyQGFnpVCZKKGCiEnDmtFA==",
"dev": true,
"requires": {
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9",
"web3-providers-http": "1.2.9",
"web3-providers-ipc": "1.2.9",
"web3-providers-ws": "1.2.9"
}
},
"web3-core-subscriptions": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.9.tgz",
"integrity": "sha512-Y48TvXPSPxEM33OmXjGVDMzTd0j8X0t2+sDw66haeBS8eYnrEzasWuBZZXDq0zNUsqyxItgBGDn+cszkgEnFqg==",
"dev": true,
"requires": {
"eventemitter3": "3.1.2",
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9"
}
},
"web3-eth": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.9.tgz",
"integrity": "sha512-sIKO4iE9FEBa/CYUd6GdPd7GXt/wISqxUd8PlIld6+hvMJj02lgO7Z7p5T9mZIJcIZJGvZX81ogx8oJ9yif+Ag==",
"dev": true,
"requires": {
"underscore": "1.9.1",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-core-subscriptions": "1.2.9",
"web3-eth-abi": "1.2.9",
"web3-eth-accounts": "1.2.9",
"web3-eth-contract": "1.2.9",
"web3-eth-ens": "1.2.9",
"web3-eth-iban": "1.2.9",
"web3-eth-personal": "1.2.9",
"web3-net": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-eth-accounts": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.9.tgz",
"integrity": "sha512-jkbDCZoA1qv53mFcRHCinoCsgg8WH+M0YUO1awxmqWXRmCRws1wW0TsuSQ14UThih5Dxolgl+e+aGWxG58LMwg==",
"dev": true,
"requires": {
"crypto-browserify": "3.12.0",
"eth-lib": "^0.2.8",
"ethereumjs-common": "^1.3.2",
"ethereumjs-tx": "^2.1.1",
"scrypt-js": "^3.0.1",
"underscore": "1.9.1",
"uuid": "3.3.2",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-eth-contract": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.9.tgz",
"integrity": "sha512-PYMvJf7EG/HyssUZa+pXrc8IB06K/YFfWYyW4R7ed3sab+9wWUys1TlWxBCBuiBXOokSAyM6H6P6/cKEx8FT8Q==",
"dev": true,
"requires": {
"@types/bn.js": "^4.11.4",
"underscore": "1.9.1",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-core-promievent": "1.2.9",
"web3-core-subscriptions": "1.2.9",
"web3-eth-abi": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-eth-ens": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.9.tgz",
"integrity": "sha512-kG4+ZRgZ8I1WYyOBGI8QVRHfUSbbJjvJAGA1AF/NOW7JXQ+x7gBGeJw6taDWJhSshMoEKWcsgvsiuoG4870YxQ==",
"dev": true,
"requires": {
"content-hash": "^2.5.2",
"eth-ens-namehash": "2.0.8",
"underscore": "1.9.1",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-promievent": "1.2.9",
"web3-eth-abi": "1.2.9",
"web3-eth-contract": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-eth-iban": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.9.tgz",
"integrity": "sha512-RtdVvJE0pyg9dHLy0GzDiqgnLnssSzfz/JYguhC1wsj9+Gnq1M6Diy3NixACWUAp6ty/zafyOaZnNQ+JuH9TjQ==",
"dev": true,
"requires": {
"bn.js": "4.11.8",
"web3-utils": "1.2.9"
}
},
"web3-eth-personal": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.9.tgz",
"integrity": "sha512-cFiNrktxZ1C/rIdJFzQTvFn3/0zcsR3a+Jf8Y3KxeQDHszQtosjLWptP7bsUmDwEh4hzh0Cy3KpOxlYBWB8bJQ==",
"dev": true,
"requires": {
"@types/node": "^12.6.1",
"web3-core": "1.2.9",
"web3-core-helpers": "1.2.9",
"web3-core-method": "1.2.9",
"web3-net": "1.2.9",
"web3-utils": "1.2.9"
},
"dependencies": {
"@types/node": {
"version": "12.19.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.8.tgz",
"integrity": "sha512-D4k2kNi0URNBxIRCb1khTnkWNHv8KSL1owPmS/K5e5t8B2GzMReY7AsJIY1BnP5KdlgC4rj9jk2IkDMasIE7xg==",
"dev": true
}
}
},
"web3-net": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.9.tgz",
"integrity": "sha512-d2mTn8jPlg+SI2hTj2b32Qan6DmtU9ap/IUlJTeQbZQSkTLf0u9suW8Vjwyr4poJYXTurdSshE7OZsPNn30/ZA==",
"dev": true,
"requires": {
"web3-core": "1.2.9",
"web3-core-method": "1.2.9",
"web3-utils": "1.2.9"
}
},
"web3-providers-http": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.9.tgz",
"integrity": "sha512-F956tCIj60Ttr0UvEHWFIhx+be3He8msoPzyA44/kfzzYoMAsCFRn5cf0zQG6al0znE75g6HlWVSN6s3yAh51A==",
"dev": true,
"requires": {
"web3-core-helpers": "1.2.9",
"xhr2-cookies": "1.1.0"
}
},
"web3-providers-ipc": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.9.tgz",
"integrity": "sha512-NQ8QnBleoHA2qTJlqoWu7EJAD/FR5uimf7Ielzk4Z2z+m+6UAuJdJMSuQNj+Umhz9L/Ys6vpS1vHx9NizFl+aQ==",
"dev": true,
"requires": {
"oboe": "2.1.4",
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9"
}
},
"web3-providers-ws": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.9.tgz",
"integrity": "sha512-6+UpvINeI//dglZoAKStUXqxDOXJy6Iitv2z3dbgInG4zb8tkYl/VBDL80UjUg3ZvzWG0g7EKY2nRPEpON2TFA==",
"dev": true,
"requires": {
"eventemitter3": "^4.0.0",
"underscore": "1.9.1",
"web3-core-helpers": "1.2.9",
"websocket": "^1.0.31"
},
"dependencies": {
"eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"dev": true
}
}
},
"web3-shh": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.9.tgz",
"integrity": "sha512-PWa8b/EaxaMinFaxy6cV0i0EOi2M7a/ST+9k9nhyhCjVa2vzXuNoBNo2IUOmeZ0WP2UQB8ByJ2+p4htlJaDOjA==",
"dev": true,
"requires": {
"web3-core": "1.2.9",
"web3-core-method": "1.2.9",
"web3-core-subscriptions": "1.2.9",
"web3-net": "1.2.9"
}
}
} }
}, },
"@trufflesuite/chromafi": { "@trufflesuite/chromafi": {
...@@ -13308,27 +14108,56 @@ ...@@ -13308,27 +14108,56 @@
} }
}, },
"web3": { "web3": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3/-/web3-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.0.tgz",
"integrity": "sha512-Mo5aBRm0JrcNpN/g4VOrDzudymfOnHRC3s2VarhYxRA8aWgF5rnhQ0ziySaugpic1gksbXPe105pUWyRqw8HUA==", "integrity": "sha512-4q9dna0RecnrlgD/bD1C5S+81Untbd6Z/TBD7rb+D5Bvvc0Wxjr4OP70x+LlnwuRDjDtzBwJbNUblh2grlVArw==",
"dev": true, "dev": true,
"requires": { "requires": {
"web3-bzz": "1.2.9", "web3-bzz": "1.3.0",
"web3-core": "1.2.9", "web3-core": "1.3.0",
"web3-eth": "1.2.9", "web3-eth": "1.3.0",
"web3-eth-personal": "1.2.9", "web3-eth-personal": "1.3.0",
"web3-net": "1.2.9", "web3-net": "1.3.0",
"web3-shh": "1.2.9", "web3-shh": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
},
"dependencies": {
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
}
} }
}, },
"web3-bzz": { "web3-bzz": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.0.tgz",
"integrity": "sha512-ogVQr9jHodu9HobARtvUSmWG22cv2EUQzlPeejGWZ7j5h20HX40EDuWyomGY5VclIj5DdLY76Tmq88RTf/6nxA==", "integrity": "sha512-ibYAnKab+sgTo/UdfbrvYfWblXjjgSMgyy9/FHa6WXS14n/HVB+HfWqGz2EM3fok8Wy5XoKGMvdqvERQ/mzq1w==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/node": "^10.12.18", "@types/node": "^12.12.6",
"got": "9.6.0", "got": "9.6.0",
"swarm-js": "^0.1.40", "swarm-js": "^0.1.40",
"underscore": "1.9.1" "underscore": "1.9.1"
...@@ -13341,9 +14170,9 @@ ...@@ -13341,9 +14170,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "10.17.48", "version": "12.19.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.48.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.8.tgz",
"integrity": "sha512-Agl6xbYP6FOMDeAsr3QVZ+g7Yzg0uhPHWx0j5g4LFdUBHVtqtU+gH660k/lCEe506jJLOGbEzsnqPDTZGJQLag==", "integrity": "sha512-D4k2kNi0URNBxIRCb1khTnkWNHv8KSL1owPmS/K5e5t8B2GzMReY7AsJIY1BnP5KdlgC4rj9jk2IkDMasIE7xg==",
"dev": true "dev": true
}, },
"cacheable-request": { "cacheable-request": {
...@@ -13427,18 +14256,18 @@ ...@@ -13427,18 +14256,18 @@
} }
}, },
"web3-core": { "web3-core": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.0.tgz",
"integrity": "sha512-fSYv21IP658Ty2wAuU9iqmW7V+75DOYMVZsDH/c14jcF/1VXnedOcxzxSj3vArsCvXZNe6XC5/wAuGZyQwR9RA==", "integrity": "sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/bn.js": "^4.11.4", "@types/bn.js": "^4.11.5",
"@types/node": "^12.6.1", "@types/node": "^12.12.6",
"bignumber.js": "^9.0.0", "bignumber.js": "^9.0.0",
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"web3-core-method": "1.2.9", "web3-core-method": "1.3.0",
"web3-core-requestmanager": "1.2.9", "web3-core-requestmanager": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
}, },
"dependencies": { "dependencies": {
"@types/node": { "@types/node": {
...@@ -13452,86 +14281,227 @@ ...@@ -13452,86 +14281,227 @@
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
"integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==",
"dev": true "dev": true
},
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
} }
} }
}, },
"web3-core-helpers": { "web3-core-helpers": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz",
"integrity": "sha512-t0WAG3orLCE3lqi77ZoSRNFok3VQWZXTniZigDQjyOJYMAX7BU3F3js8HKbjVnAxlX3tiKoDxI0KBk9F3AxYuw==", "integrity": "sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw==",
"dev": true, "dev": true,
"requires": { "requires": {
"underscore": "1.9.1", "underscore": "1.9.1",
"web3-eth-iban": "1.2.9", "web3-eth-iban": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
},
"dependencies": {
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
}
} }
}, },
"web3-core-method": { "web3-core-method": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.0.tgz",
"integrity": "sha512-bjsIoqP3gs7A/gP8+QeLUCyOKJ8bopteCSNbCX36Pxk6TYfYWNuC6hP+2GzUuqdP3xaZNe+XEElQFUNpR3oyAg==", "integrity": "sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@ethersproject/transactions": "^5.0.0-beta.135", "@ethersproject/transactions": "^5.0.0-beta.135",
"underscore": "1.9.1", "underscore": "1.9.1",
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"web3-core-promievent": "1.2.9", "web3-core-promievent": "1.3.0",
"web3-core-subscriptions": "1.2.9", "web3-core-subscriptions": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
},
"dependencies": {
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
}
} }
}, },
"web3-core-promievent": { "web3-core-promievent": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz",
"integrity": "sha512-0eAUA2zjgXTleSrnc1wdoKQPPIHU6KHf4fAscu4W9kKrR+mqP1KsjYrxY9wUyjNnXxfQ+5M29ipvbiaK8OqdOw==", "integrity": "sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw==",
"dev": true, "dev": true,
"requires": { "requires": {
"eventemitter3": "3.1.2" "eventemitter3": "4.0.4"
},
"dependencies": {
"eventemitter3": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
"integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
"dev": true
}
} }
}, },
"web3-core-requestmanager": { "web3-core-requestmanager": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz",
"integrity": "sha512-1PwKV2m46ALUnIN5VPPgjOj8yMLJhhqZYvYJE34hTN5SErOkwhzx5zScvo5MN7v7KyQGFnpVCZKKGCiEnDmtFA==", "integrity": "sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw==",
"dev": true, "dev": true,
"requires": { "requires": {
"underscore": "1.9.1", "underscore": "1.9.1",
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"web3-providers-http": "1.2.9", "web3-providers-http": "1.3.0",
"web3-providers-ipc": "1.2.9", "web3-providers-ipc": "1.3.0",
"web3-providers-ws": "1.2.9" "web3-providers-ws": "1.3.0"
} }
}, },
"web3-core-subscriptions": { "web3-core-subscriptions": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz",
"integrity": "sha512-Y48TvXPSPxEM33OmXjGVDMzTd0j8X0t2+sDw66haeBS8eYnrEzasWuBZZXDq0zNUsqyxItgBGDn+cszkgEnFqg==", "integrity": "sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"eventemitter3": "3.1.2", "eventemitter3": "4.0.4",
"underscore": "1.9.1", "underscore": "1.9.1",
"web3-core-helpers": "1.2.9" "web3-core-helpers": "1.3.0"
},
"dependencies": {
"eventemitter3": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
"integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
"dev": true
}
} }
}, },
"web3-eth": { "web3-eth": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.0.tgz",
"integrity": "sha512-sIKO4iE9FEBa/CYUd6GdPd7GXt/wISqxUd8PlIld6+hvMJj02lgO7Z7p5T9mZIJcIZJGvZX81ogx8oJ9yif+Ag==", "integrity": "sha512-/bzJcxXPM9EM18JM5kO2JjZ3nEqVo3HxqU93aWAEgJNqaP/Lltmufl2GpvIB2Hvj+FXAjAXquxUdQ2/xP7BzHQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"underscore": "1.9.1", "underscore": "1.9.1",
"web3-core": "1.2.9", "web3-core": "1.3.0",
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"web3-core-method": "1.2.9", "web3-core-method": "1.3.0",
"web3-core-subscriptions": "1.2.9", "web3-core-subscriptions": "1.3.0",
"web3-eth-abi": "1.2.9", "web3-eth-abi": "1.3.0",
"web3-eth-accounts": "1.2.9", "web3-eth-accounts": "1.3.0",
"web3-eth-contract": "1.2.9", "web3-eth-contract": "1.3.0",
"web3-eth-ens": "1.2.9", "web3-eth-ens": "1.3.0",
"web3-eth-iban": "1.2.9", "web3-eth-iban": "1.3.0",
"web3-eth-personal": "1.2.9", "web3-eth-personal": "1.3.0",
"web3-net": "1.2.9", "web3-net": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
},
"dependencies": {
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-eth-abi": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz",
"integrity": "sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg==",
"dev": true,
"requires": {
"@ethersproject/abi": "5.0.0-beta.153",
"underscore": "1.9.1",
"web3-utils": "1.3.0"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
}
} }
}, },
"web3-eth-abi": { "web3-eth-abi": {
...@@ -13546,22 +14516,22 @@ ...@@ -13546,22 +14516,22 @@
} }
}, },
"web3-eth-accounts": { "web3-eth-accounts": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.0.tgz",
"integrity": "sha512-jkbDCZoA1qv53mFcRHCinoCsgg8WH+M0YUO1awxmqWXRmCRws1wW0TsuSQ14UThih5Dxolgl+e+aGWxG58LMwg==", "integrity": "sha512-/Q7EVW4L2wWUbNRtOTwAIrYvJid/5UnKMw67x/JpvRMwYC+e+744P536Ja6SG4X3MnzFvd3E/jruV4qa6k+zIw==",
"dev": true, "dev": true,
"requires": { "requires": {
"crypto-browserify": "3.12.0", "crypto-browserify": "3.12.0",
"eth-lib": "^0.2.8", "eth-lib": "0.2.8",
"ethereumjs-common": "^1.3.2", "ethereumjs-common": "^1.3.2",
"ethereumjs-tx": "^2.1.1", "ethereumjs-tx": "^2.1.1",
"scrypt-js": "^3.0.1", "scrypt-js": "^3.0.1",
"underscore": "1.9.1", "underscore": "1.9.1",
"uuid": "3.3.2", "uuid": "3.3.2",
"web3-core": "1.2.9", "web3-core": "1.3.0",
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"web3-core-method": "1.2.9", "web3-core-method": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
}, },
"dependencies": { "dependencies": {
"eth-lib": { "eth-lib": {
...@@ -13580,73 +14550,190 @@ ...@@ -13580,73 +14550,190 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
"dev": true "dev": true
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
} }
} }
}, },
"web3-eth-contract": { "web3-eth-contract": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.0.tgz",
"integrity": "sha512-PYMvJf7EG/HyssUZa+pXrc8IB06K/YFfWYyW4R7ed3sab+9wWUys1TlWxBCBuiBXOokSAyM6H6P6/cKEx8FT8Q==", "integrity": "sha512-3SCge4SRNCnzLxf0R+sXk6vyTOl05g80Z5+9/B5pERwtPpPWaQGw8w01vqYqsYBKC7zH+dxhMaUgVzU2Dgf7bQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/bn.js": "^4.11.4", "@types/bn.js": "^4.11.5",
"underscore": "1.9.1", "underscore": "1.9.1",
"web3-core": "1.2.9", "web3-core": "1.3.0",
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"web3-core-method": "1.2.9", "web3-core-method": "1.3.0",
"web3-core-promievent": "1.2.9", "web3-core-promievent": "1.3.0",
"web3-core-subscriptions": "1.2.9", "web3-core-subscriptions": "1.3.0",
"web3-eth-abi": "1.2.9", "web3-eth-abi": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
},
"dependencies": {
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-eth-abi": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz",
"integrity": "sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg==",
"dev": true,
"requires": {
"@ethersproject/abi": "5.0.0-beta.153",
"underscore": "1.9.1",
"web3-utils": "1.3.0"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
}
} }
}, },
"web3-eth-ens": { "web3-eth-ens": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.0.tgz",
"integrity": "sha512-kG4+ZRgZ8I1WYyOBGI8QVRHfUSbbJjvJAGA1AF/NOW7JXQ+x7gBGeJw6taDWJhSshMoEKWcsgvsiuoG4870YxQ==", "integrity": "sha512-WnOru+EcuM5dteiVYJcHXo/I7Wq+ei8RrlS2nir49M0QpYvUPGbCGgTbifcjJQTWamgORtWdljSA1s2Asdb74w==",
"dev": true, "dev": true,
"requires": { "requires": {
"content-hash": "^2.5.2", "content-hash": "^2.5.2",
"eth-ens-namehash": "2.0.8", "eth-ens-namehash": "2.0.8",
"underscore": "1.9.1", "underscore": "1.9.1",
"web3-core": "1.2.9", "web3-core": "1.3.0",
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"web3-core-promievent": "1.2.9", "web3-core-promievent": "1.3.0",
"web3-eth-abi": "1.2.9", "web3-eth-abi": "1.3.0",
"web3-eth-contract": "1.2.9", "web3-eth-contract": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
},
"dependencies": {
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-eth-abi": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz",
"integrity": "sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg==",
"dev": true,
"requires": {
"@ethersproject/abi": "5.0.0-beta.153",
"underscore": "1.9.1",
"web3-utils": "1.3.0"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
}
} }
}, },
"web3-eth-iban": { "web3-eth-iban": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz",
"integrity": "sha512-RtdVvJE0pyg9dHLy0GzDiqgnLnssSzfz/JYguhC1wsj9+Gnq1M6Diy3NixACWUAp6ty/zafyOaZnNQ+JuH9TjQ==", "integrity": "sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw==",
"dev": true, "dev": true,
"requires": { "requires": {
"bn.js": "4.11.8", "bn.js": "^4.11.9",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
}, },
"dependencies": { "dependencies": {
"bn.js": { "eth-lib": {
"version": "4.11.8", "version": "0.2.8",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true "dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
} }
} }
}, },
"web3-eth-personal": { "web3-eth-personal": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.0.tgz",
"integrity": "sha512-cFiNrktxZ1C/rIdJFzQTvFn3/0zcsR3a+Jf8Y3KxeQDHszQtosjLWptP7bsUmDwEh4hzh0Cy3KpOxlYBWB8bJQ==", "integrity": "sha512-2czUhElsJdLpuNfun9GeLiClo5O6Xw+bLSjl3f4bNG5X2V4wcIjX2ygep/nfstLLtkz8jSkgl/bV7esANJyeRA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/node": "^12.6.1", "@types/node": "^12.12.6",
"web3-core": "1.2.9", "web3-core": "1.3.0",
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"web3-core-method": "1.2.9", "web3-core-method": "1.3.0",
"web3-net": "1.2.9", "web3-net": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
}, },
"dependencies": { "dependencies": {
"@types/node": { "@types/node": {
...@@ -13654,71 +14741,138 @@ ...@@ -13654,71 +14741,138 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.8.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.8.tgz",
"integrity": "sha512-D4k2kNi0URNBxIRCb1khTnkWNHv8KSL1owPmS/K5e5t8B2GzMReY7AsJIY1BnP5KdlgC4rj9jk2IkDMasIE7xg==", "integrity": "sha512-D4k2kNi0URNBxIRCb1khTnkWNHv8KSL1owPmS/K5e5t8B2GzMReY7AsJIY1BnP5KdlgC4rj9jk2IkDMasIE7xg==",
"dev": true "dev": true
},
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
} }
} }
}, },
"web3-net": { "web3-net": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.0.tgz",
"integrity": "sha512-d2mTn8jPlg+SI2hTj2b32Qan6DmtU9ap/IUlJTeQbZQSkTLf0u9suW8Vjwyr4poJYXTurdSshE7OZsPNn30/ZA==", "integrity": "sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w==",
"dev": true, "dev": true,
"requires": { "requires": {
"web3-core": "1.2.9", "web3-core": "1.3.0",
"web3-core-method": "1.2.9", "web3-core-method": "1.3.0",
"web3-utils": "1.2.9" "web3-utils": "1.3.0"
},
"dependencies": {
"eth-lib": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
"integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
"dev": true,
"requires": {
"bn.js": "^4.11.6",
"elliptic": "^6.4.0",
"xhr-request-promise": "^0.1.2"
}
},
"web3-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz",
"integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==",
"dev": true,
"requires": {
"bn.js": "^4.11.9",
"eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
}
}
} }
}, },
"web3-providers-http": { "web3-providers-http": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.0.tgz",
"integrity": "sha512-F956tCIj60Ttr0UvEHWFIhx+be3He8msoPzyA44/kfzzYoMAsCFRn5cf0zQG6al0znE75g6HlWVSN6s3yAh51A==", "integrity": "sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA==",
"dev": true, "dev": true,
"requires": { "requires": {
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"xhr2-cookies": "1.1.0" "xhr2-cookies": "1.1.0"
} }
}, },
"web3-providers-ipc": { "web3-providers-ipc": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz",
"integrity": "sha512-NQ8QnBleoHA2qTJlqoWu7EJAD/FR5uimf7Ielzk4Z2z+m+6UAuJdJMSuQNj+Umhz9L/Ys6vpS1vHx9NizFl+aQ==", "integrity": "sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og==",
"dev": true, "dev": true,
"requires": { "requires": {
"oboe": "2.1.4", "oboe": "2.1.5",
"underscore": "1.9.1", "underscore": "1.9.1",
"web3-core-helpers": "1.2.9" "web3-core-helpers": "1.3.0"
},
"dependencies": {
"oboe": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz",
"integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=",
"dev": true,
"requires": {
"http-https": "^1.0.0"
}
}
} }
}, },
"web3-providers-ws": { "web3-providers-ws": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz",
"integrity": "sha512-6+UpvINeI//dglZoAKStUXqxDOXJy6Iitv2z3dbgInG4zb8tkYl/VBDL80UjUg3ZvzWG0g7EKY2nRPEpON2TFA==", "integrity": "sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw==",
"dev": true, "dev": true,
"requires": { "requires": {
"eventemitter3": "^4.0.0", "eventemitter3": "4.0.4",
"underscore": "1.9.1", "underscore": "1.9.1",
"web3-core-helpers": "1.2.9", "web3-core-helpers": "1.3.0",
"websocket": "^1.0.31" "websocket": "^1.0.32"
}, },
"dependencies": { "dependencies": {
"eventemitter3": { "eventemitter3": {
"version": "4.0.7", "version": "4.0.4",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
"dev": true "dev": true
} }
} }
}, },
"web3-shh": { "web3-shh": {
"version": "1.2.9", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.9.tgz", "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.0.tgz",
"integrity": "sha512-PWa8b/EaxaMinFaxy6cV0i0EOi2M7a/ST+9k9nhyhCjVa2vzXuNoBNo2IUOmeZ0WP2UQB8ByJ2+p4htlJaDOjA==", "integrity": "sha512-IZTojA4VCwVq+7eEIHuL1tJXtU+LJDhO8Y2QmuwetEWW1iBgWCGPHZasipWP+7kDpSm/5lo5GRxL72FF/Os/tA==",
"dev": true, "dev": true,
"requires": { "requires": {
"web3-core": "1.2.9", "web3-core": "1.3.0",
"web3-core-method": "1.2.9", "web3-core-method": "1.3.0",
"web3-core-subscriptions": "1.2.9", "web3-core-subscriptions": "1.3.0",
"web3-net": "1.2.9" "web3-net": "1.3.0"
} }
}, },
"web3-utils": { "web3-utils": {
......
...@@ -70,7 +70,8 @@ ...@@ -70,7 +70,8 @@
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"solhint": "^3.2.0", "solhint": "^3.2.0",
"solidity-coverage": "^0.7.11", "solidity-coverage": "^0.7.11",
"solidity-docgen": "^0.5.3" "solidity-docgen": "^0.5.3",
"web3": "^1.3.0"
}, },
"dependencies": {} "dependencies": {}
} }
const ethSigUtil = require('eth-sig-util'); const ethSigUtil = require('eth-sig-util');
const Wallet = require('ethereumjs-wallet').default; const Wallet = require('ethereumjs-wallet').default;
const EIP712 = artifacts.require('EIP712External'); const { EIP712Domain, domainSeparator } = require('../helpers/eip712');
const EIP712Domain = [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' },
];
async function domainSeparator (name, version, chainId, verifyingContract) { const EIP712 = artifacts.require('EIP712External');
return '0x' + ethSigUtil.TypedDataUtils.hashStruct(
'EIP712Domain',
{ name, version, chainId, verifyingContract },
{ EIP712Domain },
).toString('hex');
}
contract('EIP712', function (accounts) { contract('EIP712', function (accounts) {
const [mailTo] = accounts; const [mailTo] = accounts;
......
/* eslint-disable */
const { BN, constants, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers');
const { expect } = require('chai');
const { MAX_UINT256, ZERO_ADDRESS, ZERO_BYTES32 } = constants;
const { fromRpcSig } = require('ethereumjs-util');
const ethSigUtil = require('eth-sig-util');
const Wallet = require('ethereumjs-wallet').default;
const ERC20PermitMock = artifacts.require('ERC20PermitMock');
const { EIP712Domain, domainSeparator } = require('../helpers/eip712');
const Permit = [
{ name: 'owner', type: 'address' },
{ name: 'spender', type: 'address' },
{ name: 'value', type: 'uint256' },
{ name: 'nonce', type: 'uint256' },
{ name: 'deadline', type: 'uint256' },
];
contract('ERC20Permit', function (accounts) {
const [ initialHolder, spender, recipient, other ] = accounts;
const name = 'My Token';
const symbol = 'MTKN';
const version = '1';
const initialSupply = new BN(100);
beforeEach(async function () {
this.token = await ERC20PermitMock.new(name, symbol, initialHolder, initialSupply);
// We get the chain id from the contract because Ganache (used for coverage) does not return the same chain id
// from within the EVM as from the JSON RPC interface.
// See https://github.com/trufflesuite/ganache-core/issues/515
this.chainId = await this.token.getChainId();
});
it('initial nonce is 0', async function () {
expect(await this.token.nonces(initialHolder)).to.be.bignumber.equal('0');
});
it('domain separator', async function () {
expect(
await this.token.DOMAIN_SEPARATOR(),
).to.equal(
await domainSeparator(name, version, this.chainId, this.token.address),
);
});
describe('permit', function () {
const wallet = Wallet.generate();
const owner = wallet.getAddressString();
const value = new BN(42);
const nonce = 0;
const maxDeadline = MAX_UINT256;
const buildData = (chainId, verifyingContract, deadline = maxDeadline) => ({
primaryType: 'Permit',
types: { EIP712Domain, Permit },
domain: { name, version, chainId, verifyingContract },
message: { owner, spender, value, nonce, deadline },
});
it('accepts owner signature', async function () {
const data = buildData(this.chainId, this.token.address);
const signature = ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data });
const { v, r, s } = fromRpcSig(signature);
const receipt = await this.token.permit(owner, spender, value, maxDeadline, v, r, s);
expect(await this.token.nonces(owner)).to.be.bignumber.equal('1');
expect(await this.token.allowance(owner, spender)).to.be.bignumber.equal(value);
});
it('rejects reused signature', async function () {
const data = buildData(this.chainId, this.token.address);
const signature = ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data });
const { v, r, s } = fromRpcSig(signature);
await this.token.permit(owner, spender, value, maxDeadline, v, r, s);
await expectRevert(
this.token.permit(owner, spender, value, maxDeadline, v, r, s),
'ERC20Permit: invalid signature',
);
});
it('rejects other signature', async function () {
const otherWallet = Wallet.generate();
const data = buildData(this.chainId, this.token.address);
const signature = ethSigUtil.signTypedMessage(otherWallet.getPrivateKey(), { data });
const { v, r, s } = fromRpcSig(signature);
await expectRevert(
this.token.permit(owner, spender, value, maxDeadline, v, r, s),
'ERC20Permit: invalid signature',
);
});
it('rejects expired permit', async function () {
const deadline = (await time.latest()) - time.duration.weeks(1);
const data = buildData(this.chainId, this.token.address, deadline);
const signature = ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data });
const { v, r, s } = fromRpcSig(signature);
await expectRevert(
this.token.permit(owner, spender, value, deadline, v, r, s),
'ERC20Permit: expired deadline',
);
});
});
});
const ethSigUtil = require('eth-sig-util');
const EIP712Domain = [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' },
];
async function domainSeparator (name, version, chainId, verifyingContract) {
return '0x' + ethSigUtil.TypedDataUtils.hashStruct(
'EIP712Domain',
{ name, version, chainId, verifyingContract },
{ EIP712Domain },
).toString('hex');
}
module.exports = {
EIP712Domain,
domainSeparator,
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment