diff --git a/.gitignore b/.gitignore index 1e238ae..97b7c8f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ build/ cache/ node_modules/ .idea/ - +temp/ diff --git a/.openzeppelin/ropsten.json b/.openzeppelin/ropsten.json new file mode 100644 index 0000000..552c718 --- /dev/null +++ b/.openzeppelin/ropsten.json @@ -0,0 +1,497 @@ +{ + "manifestVersion": "3.2", + "impls": { + "027b5eecbe928a9fdf51cdf3fcf2233aa9780998fdc6a99c9ffabfb62673d719": { + "address": "0x1d7CfC8e1F2e4D687ceEAF293dEcf6f4FD3CAFF3", + "txHash": "0xb6d5c520baf251d1e20d9d262fd41f6de6c67ec8e432ca9e0bc60aa6950f178d", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:25" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:30" + }, + { + "contract": "Karma", + "label": "name", + "type": "t_string_storage", + "src": "karma-ERC20.sol:18" + }, + { + "contract": "Karma", + "label": "symbol", + "type": "t_string_storage", + "src": "karma-ERC20.sol:19" + }, + { + "contract": "Karma", + "label": "decimals", + "type": "t_uint8", + "src": "karma-ERC20.sol:20" + }, + { + "contract": "Karma", + "label": "_totalSupply", + "type": "t_uint256", + "src": "karma-ERC20.sol:21" + }, + { + "contract": "Karma", + "label": "balances", + "type": "t_mapping(t_address,t_uint256)", + "src": "karma-ERC20.sol:24" + }, + { + "contract": "Karma", + "label": "allowed", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "karma-ERC20.sol:27" + } + ], + "types": { + "t_string_storage": { + "label": "string" + }, + "t_uint8": { + "label": "uint8" + }, + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_bool": { + "label": "bool" + } + } + } + }, + "7ac794b5408b50b4c997dd3041533feedf0376c395b876e44423b6972df4ec10": { + "address": "0x72fCA82ac8B6FB0e0F8893B8bd5EEF836cb7952c", + "txHash": "0x65ba21c1eb2e3b340c5d80dba651bce89fdded4ae6e19b9592744062356c5132", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:25" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:30" + }, + { + "contract": "Karma1", + "label": "name", + "type": "t_string_storage", + "src": "karma-1-ERC20.sol:18" + }, + { + "contract": "Karma1", + "label": "symbol", + "type": "t_string_storage", + "src": "karma-1-ERC20.sol:19" + }, + { + "contract": "Karma1", + "label": "decimals", + "type": "t_uint8", + "src": "karma-1-ERC20.sol:20" + }, + { + "contract": "Karma1", + "label": "_totalSupply", + "type": "t_uint256", + "src": "karma-1-ERC20.sol:21" + }, + { + "contract": "Karma1", + "label": "balances", + "type": "t_mapping(t_address,t_uint256)", + "src": "karma-1-ERC20.sol:24" + }, + { + "contract": "Karma1", + "label": "allowed", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "karma-1-ERC20.sol:27" + } + ], + "types": { + "t_string_storage": { + "label": "string" + }, + "t_uint8": { + "label": "uint8" + }, + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_bool": { + "label": "bool" + } + } + } + }, + "3998d9b70b50a95001fb0c2c1eeeb6d6911b0514c501b9bc9776dd34853253f8": { + "address": "0xB43228eD01780a8EC786dD0a93a693db61f6fe99", + "txHash": "0x79f332c2920771f596bee8f1e2561e5cbaa9880ab77520f22e9b1c9210f09213", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:25" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:30" + }, + { + "contract": "Karma", + "label": "name", + "type": "t_string_storage", + "src": "karma-ERC20.sol:18" + }, + { + "contract": "Karma", + "label": "symbol", + "type": "t_string_storage", + "src": "karma-ERC20.sol:19" + }, + { + "contract": "Karma", + "label": "decimals", + "type": "t_uint8", + "src": "karma-ERC20.sol:20" + }, + { + "contract": "Karma", + "label": "_totalSupply", + "type": "t_uint256", + "src": "karma-ERC20.sol:21" + }, + { + "contract": "Karma", + "label": "token", + "type": "t_string_storage", + "src": "karma-ERC20.sol:23" + }, + { + "contract": "Karma", + "label": "balances", + "type": "t_mapping(t_address,t_uint256)", + "src": "karma-ERC20.sol:25" + }, + { + "contract": "Karma", + "label": "allowed", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "karma-ERC20.sol:28" + } + ], + "types": { + "t_string_storage": { + "label": "string" + }, + "t_uint8": { + "label": "uint8" + }, + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_bool": { + "label": "bool" + } + } + } + }, + "94563e78ca87c0af1f2c387fbf1fa660f3f51021b26bddd598e097c2c28c188f": { + "address": "0xe3EF2247eFFC89a2DC53600bCe7153Bb9c8114A4", + "txHash": "0xa71017d6c79a420a128c4dbd051f2f2bc83e84294d6f5e6bc96b3bf67c483f31", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:25" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:30" + }, + { + "contract": "Karma", + "label": "name", + "type": "t_string_storage", + "src": "karma-ERC20.sol:20" + }, + { + "contract": "Karma", + "label": "symbol", + "type": "t_string_storage", + "src": "karma-ERC20.sol:21" + }, + { + "contract": "Karma", + "label": "decimals", + "type": "t_uint8", + "src": "karma-ERC20.sol:22" + }, + { + "contract": "Karma", + "label": "_totalSupply", + "type": "t_uint256", + "src": "karma-ERC20.sol:23" + }, + { + "contract": "Karma", + "label": "balances", + "type": "t_mapping(t_address,t_uint256)", + "src": "karma-ERC20.sol:26" + }, + { + "contract": "Karma", + "label": "allowed", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "karma-ERC20.sol:29" + } + ], + "types": { + "t_string_storage": { + "label": "string" + }, + "t_uint8": { + "label": "uint8" + }, + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_bool": { + "label": "bool" + } + } + } + }, + "f98d1047bbcd0fa186791dda2e7ad9c057e7c2d90c685c78aac5504afb475033": { + "address": "0x976E8473cFCa5A0AD715f29E486a2bc8bAec5Eb7", + "txHash": "0xeb21e0101b2614b26cb44565b4657293e84b99a485fb196ba6289ea428bfde9d", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:25" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "../@openzeppelin/contracts/proxy/utils/Initializable.sol:30" + }, + { + "contract": "KarmaV1", + "label": "name", + "type": "t_string_storage", + "src": "karma-1-ERC20.sol:18" + }, + { + "contract": "KarmaV1", + "label": "symbol", + "type": "t_string_storage", + "src": "karma-1-ERC20.sol:19" + }, + { + "contract": "KarmaV1", + "label": "decimals", + "type": "t_uint8", + "src": "karma-1-ERC20.sol:20" + }, + { + "contract": "KarmaV1", + "label": "_totalSupply", + "type": "t_uint256", + "src": "karma-1-ERC20.sol:21" + }, + { + "contract": "KarmaV1", + "label": "balances", + "type": "t_mapping(t_address,t_uint256)", + "src": "karma-1-ERC20.sol:24" + }, + { + "contract": "KarmaV1", + "label": "allowed", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "karma-1-ERC20.sol:27" + } + ], + "types": { + "t_string_storage": { + "label": "string" + }, + "t_uint8": { + "label": "uint8" + }, + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_bool": { + "label": "bool" + } + } + } + } + }, + "proxies": [ + { + "address": "0x1f8b713eED3340cE1C40CA6Bb4D1bCC0318E7F94", + "kind": "transparent", + "txHash": "0x6f851f68462732b3fa5fe1052867f14f84dd69d94d5737cdbc53ac2ad321af62" + }, + { + "address": "0x70Dd051Ee7C2DBf52a4A54864A29a931C81c6eb7", + "kind": "transparent", + "txHash": "0xe5f7f3ae42437b49d485336858ec897fd7b7dbc4c71369c0a323f4d0dd2c6f22" + }, + { + "address": "0x5894E784089a1057f4042aF54Ec9acC78ecE5c18", + "kind": "transparent", + "txHash": "0x07e6d898e8cb76a75940d795770063791080911dec344142b806a0822cb8f936" + }, + { + "address": "0x9e165BfC9a3A3086Ca8412fB1E0690C478180057", + "kind": "transparent", + "txHash": "0xa49e6bda5ccc66e10e77163dc7bd35adccc9506b86ec4fde3b7e3daf20c0050f" + }, + { + "address": "0x7788541d6601179aeE712A90AFB85E5DE832F971", + "kind": "transparent", + "txHash": "0x4c3ddbe87331b269b691f119d95f9ae36588d6146221612bdbb036916f30ee8d" + }, + { + "address": "0x1326C0f2713FAC4F8627e70fa815DF1cbAB22aE5", + "kind": "transparent", + "txHash": "0xe74d3255e9e46afaf4824aafbd662fe4b0a71a6a483652ae87fb76e049e4724c" + }, + { + "address": "0x62f0d2E5353d6f6d0c4db5d36b940d42026B76dE", + "kind": "transparent", + "txHash": "0x2192804b00bba4994d63faa504239b966f7d2cf9fbc2a6c16995536eb321f3a2" + }, + { + "address": "0xDeb19B7fbe3B24Bf0D1E0e4d5050c54091a54224", + "kind": "transparent", + "txHash": "0xa865fc3655dfd75e5bb519d42776e902b4ce3117adc4eb2d2f244a5bb1cf4559" + }, + { + "address": "0x0590eF6Acd9a351b2feDF7b07019C3947874E245", + "kind": "transparent", + "txHash": "0x401b7d9283c12555ea0b8791221cae136ef6dcc7dd6d51c90b8fee1a96e436f9" + }, + { + "address": "0xBA139eaE071B9F86e849855473a13E528De0dCa2", + "kind": "transparent", + "txHash": "0x1efa0caf23c059a9cd83b1284cfab7cba7504505da3d32744b25d3b98f20736d" + }, + { + "address": "0xed8cABdFE71F56C3C1F16c281327EC6EA69287b8", + "kind": "transparent", + "txHash": "0x2c821aa8d4fd03405f8939344e7b489300a715853e395b044a482d03f7f8f93f" + }, + { + "address": "0x7CC30155A47d016850c20818f5Ed060a40d1CD77", + "kind": "transparent", + "txHash": "0x96abef287aa1991d1428689f663caa7bc51b092fe3c8e02231fa5a48d0ae5b1c" + }, + { + "address": "0xAE42463702dD3c9B2236e1B6dE71147785ae0FAB", + "kind": "transparent", + "txHash": "0x20d1e7491a1f8d9769d0d2c4a45aebf18a37755b00ecf9fe2fb0a053393b3cbe" + }, + { + "address": "0xf769D7639eFe3baf213f1792C496dEed0B747292", + "kind": "transparent", + "txHash": "0x750fc5f5aafb00aef5c54451f117e663520ccbe87c76adf85c5470bcf3a6673a" + }, + { + "address": "0x7EE6c7Dc9bA67eB9c6836021623a19d6993c9A47", + "kind": "transparent", + "txHash": "0xec2965c3ac6af8900e5ee9efdc26fe6bd053fa7428da11d4e13c4cc657cced4a" + }, + { + "address": "0x488CDD806884AD782e5d7BFB359e44E62016F00A", + "kind": "transparent", + "txHash": "0x5d35098d3e0731eae352baeb69c2aac1e218d1aec81665a3313b7a063ddbaa65" + }, + { + "address": "0x78512F4A12e6EBa462A8aD381F67640eB1CE6ffD", + "kind": "transparent", + "txHash": "0xcae900067ed3d8d2761d83ada94633a39223ea63757941a1af099b231914945a" + } + ], + "admin": { + "address": "0x5aCDF749f25d91d4BF254053dCc5d81Aa7d564A5", + "txHash": "0xeb870bd815db7b0eaad8c4cddb39ea10c7962c49796d1d6ad308ef7b9e34c4c1" + } +} diff --git a/contracts/Migrations.sol b/contracts/Migrations.sol index 9aac975..17ffe16 100644 --- a/contracts/Migrations.sol +++ b/contracts/Migrations.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; +// https://www.trufflesuite.com/docs/truffle/getting-started/running-migrations#initial-migration contract Migrations { address public owner = msg.sender; uint public last_completed_migration; @@ -10,10 +11,13 @@ contract Migrations { msg.sender == owner, "This function is restricted to the contract's owner" ); - _; + _; // Execute the body of the function } + // A function with the signature `setCompleted(uint)` is required. + // + Restrict this call to the owner of this Migration contract function setCompleted(uint completed) public restricted { last_completed_migration = completed; } + } diff --git a/contracts/karma-ERC20.sol b/contracts/karma-ERC20.sol index f71dff4..01c0e4c 100644 --- a/contracts/karma-ERC20.sol +++ b/contracts/karma-ERC20.sol @@ -8,12 +8,15 @@ pragma solidity >= 0.8.0; // ETH EIP repo: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md // ---------------------------------------------------------------------------- import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; // ---------------------------------------------------------------------------- -// SourceCoin Contract +// Karma Contract // ---------------------------------------------------------------------------- -contract Karma is IERC20 +contract Karma is IERC20, Initializable { + // Avoid initializing fields in declarations + // https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable#avoid-initial-values-in-field-declarations string public name; string public symbol; uint8 public decimals; // 18 decimals is the strongly suggested default, avoid changing it @@ -24,24 +27,46 @@ contract Karma is IERC20 // Owner of account approves the transfer of an amount to another account mapping(address => mapping(address => uint)) allowed; +// +// /** +// * Constrctor function +// * +// * Initializes contract with initial supply tokens to the creator of the contract +// */ +// constructor() +// { +// name = "Karma"; // Name of the token +// symbol = "KRMA"; // Abbreviation of the token +// decimals = 18; // Number of decimals that can be used to split token +// +// +// // FORMAT: +// // Where SUPPLY is the number of coins in base 10 decimal notation +// // And DECIMALS is a trailing number of 0's; Count must match `decimals` value set above +// // 1000 000 000 000000000000000000 == 1 billion total supply; +// // + trailing 0's represent the 18 decimal locations that can be used to send fractions +// _totalSupply = 1000000000000000000000000000; +// +// +// // Set the remaining balance of the contract owner to the total supply +// balances[msg.sender] = _totalSupply; // msg.sender is the calling address for this constructor +// // Transfer the total supply to the contract owner on initialization +// emit Transfer(address(0), msg.sender, _totalSupply); // address(0) is used to represent a new TX +// } - - /** - * Constrctor function - * - * Initializes contract with initial supply tokens to the creator of the contract - */ - constructor() + function initialize() public initializer { + // ERC20 Standard dictates names of these variables + // https://ethereum.org/en/developers/docs/standards/tokens/erc-20/#body name = "Karma"; // Name of the token symbol = "KRMA"; // Abbreviation of the token decimals = 18; // Number of decimals that can be used to split token - - + + // FORMAT: // Where SUPPLY is the number of coins in base 10 decimal notation // And DECIMALS is a trailing number of 0's; Count must match `decimals` value set above - // 1000 000 000 000000000000000000 == 1 billion total supply; + // 1000 000 000 000000000000000000 == 1 billion total supply; // + trailing 0's represent the 18 decimal locations that can be used to send fractions _totalSupply = 1000000000000000000000000000; @@ -66,20 +91,42 @@ contract Karma is IERC20 return balances[tokenOwner]; // Return the balance of the owner's address } - /// @param tokenOwner The address of the account owning tokens - /// @param spender The address of the account able to transfer the tokens - /// returns Amount of remaining tokens allowed to spent + // To initiate a transaction, we first approve an address to withdraw from our wallet + // + msg.sender is approving spender to withdraw from its balance _value tokens + // Allow `spender` to withdraw from your account, multiple times, up to the `tokens` + // If this function is called again it overwrites the current allowance with _value + function approve(address spender, uint _value) public override returns (bool success) + { + // https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + //if ((value != 0) && (allowed[msg.sender][spender] != 0)) throw; + + allowed[msg.sender][spender] = _value; + emit Approval(msg.sender, spender, _value); + return true; + } + + // Helper to check the amount of tokens allowed for this spender at this address + // @param tokenOwner The address of the account owning tokens + // @param spender The address of the account able to transfer the tokens + // returns Amount of remaining tokens allowed to spent function allowance(address tokenOwner, address spender) public override view returns (uint remaining) { return allowed[tokenOwner][spender]; } - // Allow `spender` to withdraw from your account, multiple times, up to the `tokens` - // If this function is called again it overwrites the current allowance with _value. - function approve(address spender, uint tokens) public override returns (bool success) + // Send `_value` amount of tokens from address `from` to address `to` + function transferFrom(address from, address to, uint _value) public override returns (bool success) { - allowed[msg.sender][spender] = tokens; - emit Approval(msg.sender, spender, tokens); + // Set this wallet balance -= _value + balances[from] = balances[from] - _value; + + // Update this wallet's approved balance for the withdrawing address +// uint allowance = allowed[from][msg.sender]; + allowed[from][msg.sender] -= _value; + + // Add the amount of tokens to the balance at the receiving address + balances[to] = balances[to] + _value; + emit Transfer(from, to, _value); return true; } @@ -91,20 +138,5 @@ contract Karma is IERC20 emit Transfer(msg.sender, to, tokens); return true; } - - // Send `tokens` amount of tokens from address `from` to address `to` - // The transferFrom method is used for a withdraw workflow, allowing contracts to send - // tokens on your behalf, for example to "deposit" to a contract address and/or to charge - // fees in sub-currencies; the command should fail unless the _from account has - // deliberately authorized the sender of the message via some mechanism; we propose - // these standardized APIs for approval: - function transferFrom(address from, address to, uint tokens) public override returns (bool success) - { - balances[from] = balances[from] - tokens; - allowed[from][msg.sender] = allowed[from][msg.sender] - tokens; - balances[to] = balances[to] - tokens; - emit Transfer(from, to, tokens); - return true; - } - + } diff --git a/example.secrets.json b/example.secrets.json index 9027824..e7b8093 100644 --- a/example.secrets.json +++ b/example.secrets.json @@ -1,4 +1,5 @@ { "alchemyApiUrl": "https://eth-ropsten.alchemyapi.io/v2/YOUR_ALCHEMY_API_KEY", - "mnemonic": "word word word word word word word word word word word" + "mnemonic": "word word word word word word word word word word word", + "etherscanApiKey": "SOMEREALLYLONGKEYFROMETHERSCAN" } \ No newline at end of file diff --git a/migrations/2_deploy.js b/migrations/2_deploy.js deleted file mode 100644 index db99094..0000000 --- a/migrations/2_deploy.js +++ /dev/null @@ -1,5 +0,0 @@ -const Karma = artifacts.require("Karma"); - -module.exports = function (deployer) { - deployer.deploy(Karma); -}; diff --git a/migrations/2_deploy_karma.js b/migrations/2_deploy_karma.js new file mode 100644 index 0000000..43ca7d1 --- /dev/null +++ b/migrations/2_deploy_karma.js @@ -0,0 +1,10 @@ +const { deployProxy } = require('@openzeppelin/truffle-upgrades'); + +const Karma = artifacts.require('Karma'); + +module.exports = async function (deployer) { + // initializer chooses function to call on initialization + // + initialize() defined in karma-ERC20.sol, marked as initializer + // https://docs.openzeppelin.com/upgrades-plugins/1.x/api-truffle-upgrades#deploy-proxy + await deployProxy(Karma, {deployer, initializer: 'initialize'}); +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fc5cd63..3ae9db2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1485,6 +1485,12 @@ "seedrandom": "^3.0.5" } }, + "@cto.af/textdecoder": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@cto.af/textdecoder/-/textdecoder-0.0.0.tgz", + "integrity": "sha512-sJpx3F5xcVV/9jNYJQtvimo4Vfld/nD3ph+ZWtQzZ03Zo8rJC7QKQTRcIGS13Rcz80DwFNthCWMrd58vpY4ZAQ==", + "dev": true + }, "@ethersproject/abi": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", @@ -3535,6 +3541,128 @@ "integrity": "sha512-UcIJl/vUVjTr3H1yYXZi7Sr2PlXzBEHVUJKOUlVyzyy0FI8oQCCy0Wx+BuK/fojdnmLeMvUk4KUvhKUybP+C7Q==", "dev": true }, + "@openzeppelin/truffle-upgrades": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/truffle-upgrades/-/truffle-upgrades-1.6.0.tgz", + "integrity": "sha512-GXx2pfl7zFW6AN2r+V8EA4K2KVSN+eum1CCn04oZq7M7bcj9CQ+z45983NnR4r0pxc0xNwGBbAwEBy10Tqn7zg==", + "dev": true, + "requires": { + "@openzeppelin/upgrades-core": "^1.7.0", + "@truffle/contract": "^4.2.12", + "solidity-ast": "^0.4.15" + } + }, + "@openzeppelin/upgrades-core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.7.0.tgz", + "integrity": "sha512-evNIRe2g8JzyD0+9k67LS/2MWhYQc8AAYOe1ueKSk62bpBXfMbADzty/Ah37FyAnVkHbj3H6hcl6hvPWGCw9gQ==", + "dev": true, + "requires": { + "bn.js": "^5.1.2", + "cbor": "^7.0.0", + "chalk": "^4.1.0", + "compare-versions": "^3.6.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "fp-ts": "^2.7.1", + "io-ts": "^2.2.9", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.15" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cbor": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-7.0.5.tgz", + "integrity": "sha512-0aaAPgW92lLmypb9iCd22k7tSD1FbF6dps8VQzmIBKY6ych2gO09b2vo/SbaLTmezJuB8Kh88Rvpl/Uq52mNZg==", + "dev": true, + "requires": { + "@cto.af/textdecoder": "^0.0.0", + "nofilter": "^2.0.3" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "ethereumjs-util": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", + "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "nofilter": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-2.0.3.tgz", + "integrity": "sha512-FbuXC+lK+GU2+63D1kC1ETiZo+Z7SIi7B+mxKTCH1byrh6WFvfBCN/wpherFz0a0bjGd7EKTst/cz0yLeNngug==", + "dev": true, + "requires": { + "@cto.af/textdecoder": "^0.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -4228,6 +4356,12 @@ "fast-check": "^2.12.1" } }, + "@truffle/blockchain-utils": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.0.29.tgz", + "integrity": "sha512-bPUN0GBc9kEAD0Hg7BJXQ0F1BwPI/4wwc1B580QwyOQp0Fp8uK9kOOxNagh4wB+s8vPFlmC62OqoYyG4CeYyHQ==", + "dev": true + }, "@truffle/code-utils": { "version": "1.2.26", "resolved": "https://registry.npmjs.org/@truffle/code-utils/-/code-utils-1.2.26.tgz", @@ -4285,6 +4419,46 @@ "original-require": "^1.0.1" } }, + "@truffle/contract": { + "version": "4.3.15", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.3.15.tgz", + "integrity": "sha512-PHM6tCF/GB3r/t5YbeXagtg9XPtjFgbc5YnRcXs8m2Cp2hXFeU91n1dxmIkBVJklia+tWGqLuVxvMqI88tcWbw==", + "dev": true, + "requires": { + "@truffle/blockchain-utils": "^0.0.29", + "@truffle/contract-schema": "^3.4.0", + "@truffle/debug-utils": "^5.0.15", + "@truffle/error": "^0.0.13", + "@truffle/interface-adapter": "^0.4.22", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.32", + "web3": "1.3.5", + "web3-core-helpers": "1.3.5", + "web3-core-promievent": "1.3.5", + "web3-eth-abi": "1.3.5", + "web3-utils": "1.3.5" + }, + "dependencies": { + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "dev": true + } + } + }, + "@truffle/contract-schema": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.0.tgz", + "integrity": "sha512-Kk2t7r98tiL3nxj0/4ukZ7Asvi5K/5JlHuI3jM7dXAMhrWYrt+nf5LZVwJPd1nlzuZy8WK4AgSj2B1vCTz/AlQ==", + "dev": true, + "requires": { + "ajv": "^6.10.0", + "crypto-js": "^3.1.9-1", + "debug": "^4.3.1" + } + }, "@truffle/db": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/@truffle/db/-/db-0.5.8.tgz", @@ -4313,6 +4487,51 @@ "web3-utils": "1.3.5" } }, + "@truffle/debug-utils": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-5.0.15.tgz", + "integrity": "sha512-G5y+0Xx+IM6C9b8Vjm6bl73wIjB1/2qtVKnBlhbKfgxNpRgxFvXE/jeSkCPYpcnF3CsGign0dsIyZj59tMqE5A==", + "dev": true, + "requires": { + "@truffle/codec": "^0.10.5", + "@trufflesuite/chromafi": "^2.2.2", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlight.js": "^10.4.0", + "highlightjs-solidity": "^1.0.22" + }, + "dependencies": { + "@truffle/codec": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.10.5.tgz", + "integrity": "sha512-M8YR8hKxXTypgg8g8iD/rUkkWgS89/NqkLAR+ZpZIzO3PZ5pkiIysO2VkWeqJid8hVDM4O4Eswgt2ISrQzsVRg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "bn.js": "^5.1.3", + "cbor": "^5.1.0", + "debug": "^4.3.1", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.partition": "^4.6.0", + "lodash.sum": "^4.0.2", + "semver": "^7.3.4", + "utf8": "^3.0.0", + "web3-utils": "1.3.5" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@truffle/debugger": { "version": "8.0.22", "resolved": "https://registry.npmjs.org/@truffle/debugger/-/debugger-8.0.22.tgz", @@ -4355,8 +4574,7 @@ "version": "0.0.13", "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.13.tgz", "integrity": "sha512-tzB2Kt9QSMK0He86ZFYhNyew9V6vZ7FboqmCFL5YyQd/P2mY14PJIw92NdkcTGxn1GNe+oYoHBS0Eu1c7DhC5Q==", - "dev": true, - "optional": true + "dev": true }, "@truffle/events": { "version": "0.0.9", @@ -4390,7 +4608,6 @@ "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.4.22.tgz", "integrity": "sha512-G5uLkXUv/1Cp4090hEGX9Y96FwUuLvsZloZu/cF3ltK/oj0ltNPMxt009v5ptFu3jH1c2IwLvxtvvL0Y+pI8GQ==", "dev": true, - "optional": true, "requires": { "bn.js": "^5.1.3", "ethers": "^4.0.32", @@ -4667,6 +4884,63 @@ "web3-utils": "1.3.5" } }, + "@trufflesuite/chromafi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-2.2.2.tgz", + "integrity": "sha512-mItQwVBsb8qP/vaYHQ1kDt2vJLhjoEXJptT6y6fJGvFophMFhOI/NsTVUa0nJL1nyMeFiS6hSYuNVdpQZzB1gA==", + "dev": true, + "requires": { + "ansi-mark": "^1.0.0", + "ansi-regex": "^3.0.0", + "array-uniq": "^1.0.3", + "camelcase": "^4.1.0", + "chalk": "^2.3.2", + "cheerio": "^1.0.0-rc.2", + "detect-indent": "^5.0.0", + "he": "^1.1.1", + "highlight.js": "^10.4.1", + "lodash.merge": "^4.6.2", + "min-indent": "^1.0.0", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0", + "super-split": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + } + } + }, "@trufflesuite/eth-json-rpc-filters": { "version": "4.1.2-1", "resolved": "https://registry.npmjs.org/@trufflesuite/eth-json-rpc-filters/-/eth-json-rpc-filters-4.1.2-1.tgz", @@ -5418,8 +5692,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", - "dev": true, - "optional": true + "dev": true }, "ajv": { "version": "6.12.6", @@ -5486,6 +5759,36 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, + "ansi-mark": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ansi-mark/-/ansi-mark-1.0.4.tgz", + "integrity": "sha1-HNS6jVfxXxCdaq9uycqXhsik7mw=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "array-uniq": "^1.0.3", + "chalk": "^2.3.2", + "strip-ansi": "^4.0.0", + "super-split": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -6013,6 +6316,12 @@ "dev": true, "optional": true }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -7382,6 +7691,12 @@ "safe-buffer": "^5.0.1" } }, + "circular": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/circular/-/circular-1.0.5.tgz", + "integrity": "sha1-fad6+Yu96c5LWzWM1Va13e0tMUk=", + "dev": true + }, "circular-json": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", @@ -7412,6 +7727,22 @@ "restore-cursor": "^2.0.0" } }, + "cli-logger": { + "version": "0.5.40", + "resolved": "https://registry.npmjs.org/cli-logger/-/cli-logger-0.5.40.tgz", + "integrity": "sha1-CX8OEbByx8aYomxH9YiinCC0iws=", + "dev": true, + "requires": { + "circular": "^1.0.5", + "cli-util": "~1.1.27" + } + }, + "cli-regexp": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-regexp/-/cli-regexp-0.1.2.tgz", + "integrity": "sha1-a82TsJ+y7RAl0woRVdWZeVSlNRI=", + "dev": true + }, "cli-spinners": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", @@ -7419,6 +7750,15 @@ "dev": true, "optional": true }, + "cli-util": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/cli-util/-/cli-util-1.1.27.tgz", + "integrity": "sha1-QtaeNqBAoyH8nPhRwVE8rcUJMFQ=", + "dev": true, + "requires": { + "cli-regexp": "~0.1.0" + } + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -7534,6 +7874,12 @@ "dev": true, "optional": true }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -7822,6 +8168,12 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", + "dev": true + }, "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", @@ -8112,8 +8464,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "dev": true, - "optional": true + "dev": true }, "delayed-stream": { "version": "1.0.0", @@ -8919,6 +9270,20 @@ } } }, + "ethereum-ens": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", + "dev": true, + "requires": { + "bluebird": "^3.4.7", + "eth-ens-namehash": "^2.0.0", + "js-sha3": "^0.5.7", + "pako": "^1.0.4", + "underscore": "^1.8.3", + "web3": "^1.0.0-beta.34" + } + }, "ethereum-protocol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz", @@ -9191,7 +9556,6 @@ "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", "dev": true, - "optional": true, "requires": { "aes-js": "3.0.0", "bn.js": "^4.4.0", @@ -9208,8 +9572,7 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "optional": true + "dev": true } } }, @@ -9871,8 +10234,7 @@ "version": "1.14.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz", "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==", - "dev": true, - "optional": true + "dev": true }, "for-each": { "version": "0.3.3", @@ -9930,6 +10292,12 @@ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, + "fp-ts": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.10.4.tgz", + "integrity": "sha512-vMTB5zNc9PnE20q145PNbkiL9P9WegwmKVOFloi/NfHnPdAlcob6I3AKqlH/9u3k3/M/GOftZhcJdBrb+NtnDA==", + "dev": true + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -10605,6 +10973,18 @@ "upper-case": "^1.1.3" } }, + "highlight.js": { + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz", + "integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==", + "dev": true + }, + "highlightjs-solidity": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-1.0.22.tgz", + "integrity": "sha512-Ha1TDrtOwCDCSa+D99CMCdm2fOlpMqcEzC45rpwyr6SOPvor69tqhecolUA7TjnfHU8zJswH3lnxI1ti0tLmFw==", + "dev": true + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -10909,6 +11289,12 @@ "dev": true, "optional": true }, + "io-ts": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.2.16.tgz", + "integrity": "sha512-y5TTSa6VP6le0hhmIyN0dqEXkrZeJLeC5KApJq6VLci3UEKF80lZ+KuoUs02RhBxNWlrqSNxzfI7otLX1Euv8Q==", + "dev": true + }, "ip-regex": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", @@ -13884,8 +14270,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "optional": true + "dev": true }, "minimalistic-assert": { "version": "1.0.1", @@ -15345,6 +15730,12 @@ "dev": true, "optional": true }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -16563,6 +16954,17 @@ "react-is": "^16.8.1" } }, + "proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "protobufjs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.0.tgz", @@ -17527,8 +17929,7 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true, - "optional": true + "dev": true }, "reusify": { "version": "1.0.4", @@ -17735,8 +18136,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true, - "optional": true + "dev": true }, "secp256k1": { "version": "4.0.2", @@ -17875,8 +18275,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=", - "dev": true, - "optional": true + "dev": true }, "setprototypeof": { "version": "1.1.1", @@ -17921,8 +18320,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true, - "optional": true + "dev": true }, "signed-varint": { "version": "2.0.1", @@ -18231,6 +18629,12 @@ } } }, + "solidity-ast": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.20.tgz", + "integrity": "sha512-Fts52ZPp/e6kT8Pme/ZadZ3vV150rHEkLZuLuNvqovhopR0iptwK0HGVdEnCIdgdouNz8bDD7v6e0i1vKNzx7g==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -18688,6 +19092,12 @@ } } }, + "super-split": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/super-split/-/super-split-1.1.0.tgz", + "integrity": "sha512-I4bA5mgcb6Fw5UJ+EkpzqXfiuvVGS/7MuND+oBxNFmxu3ugLNrdIatzBLfhFRMVMLxgSsRy+TjIktgkF9RFSNQ==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -19112,6 +19522,29 @@ "original-require": "^1.0.1" } }, + "truffle-plugin-verify": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/truffle-plugin-verify/-/truffle-plugin-verify-0.5.7.tgz", + "integrity": "sha512-q26VTkrpzI0lS8D1j8nKG2+2cmTwc7rkDkdtvbWKAdUV+5Ijemgeo8PeQBNKKFsTqYo1ebG7IWTLE+B/7KFo1A==", + "dev": true, + "requires": { + "axios": "^0.21.1", + "cli-logger": "^0.5.40", + "delay": "^5.0.0", + "querystring": "^0.2.1" + }, + "dependencies": { + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dev": true, + "requires": { + "follow-redirects": "^1.10.0" + } + } + } + }, "ts-invariant": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", @@ -19727,8 +20160,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", - "dev": true, - "optional": true + "dev": true }, "vali-date": { "version": "1.0.0", @@ -20592,8 +21024,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", - "dev": true, - "optional": true + "dev": true }, "xss": { "version": "1.0.8", diff --git a/package.json b/package.json index 1c44720..39bba6f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ "license": "MIT", "devDependencies": { "@openzeppelin/contracts": "^4.0.0", + "@openzeppelin/truffle-upgrades": "^1.6.0", "@truffle/hdwallet-provider": "^1.3.0", - "truffle": "^5.3.3" + "truffle": "^5.3.3", + "truffle-plugin-verify": "^0.5.7" } } diff --git a/truffle-config.js b/truffle-config.js index e28d069..ba4e433 100644 --- a/truffle-config.js +++ b/truffle-config.js @@ -19,7 +19,7 @@ */ const HDWalletProvider = require('@truffle/hdwallet-provider'); -const { alchemyApiUrl, mnemonic } = require('./secrets.json'); +const { alchemyApiUrl, mnemonic, etherscanApiKey } = require('./secrets.json'); // const infuraKey = "fj4jll3k....."; // // const fs = require('fs'); @@ -43,11 +43,11 @@ module.exports = { // tab if you use this network and you must also set the `host`, `port` and `network_id` // options below to some value. // - // development: { - // host: "127.0.0.1", // Localhost (default: none) - // port: 8545, // Standard Ethereum port (default: none) - // network_id: "*", // Any network (default: none) - // }, + development: { + host: "127.0.0.1", // Localhost (default: none) + port: 8545, // Standard Ethereum port (default: none) + network_id: "*", // Any network (default: none) + }, // Another network with more advanced options... // advanced: { // port: 8777, // Custom port @@ -110,5 +110,11 @@ module.exports = { db: { enabled: false - } + }, + api_keys: { + etherscan: etherscanApiKey + }, + plugins: [ + 'truffle-plugin-verify' + ] };