Add reduced version of CryptoKitties contracts (#5)
* Update KittyCore contract to start unpaused * Add SimpleKitty contracts * Add deploy script for SimpleKitty contracts * Update flatten script
This commit is contained in:
parent
9717b38a87
commit
af0bcb6196
|
@ -1,5 +1,8 @@
|
|||
DEPLOYMENT_ACCOUNT_PRIVATE_KEY=67..14
|
||||
DEPLOYMENT_GAS_LIMIT_EXTRA=0.2
|
||||
FOREIGN_DEPLOYMENT_GAS_PRICE=1000000000
|
||||
HOME_RPC_URL=https://sokol.poa.network
|
||||
HOME_DEPLOYMENT_GAS_PRICE=1000000000
|
||||
FOREIGN_RPC_URL=https://sokol.poa.network
|
||||
FOREIGN_DEPLOYMENT_GAS_PRICE=1000000000
|
||||
CRYPTOKITTIES_ADDRESS=0x0000000000000000000000000000000000000000
|
||||
KITTIES_AMOUNT=1
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"extends": "solhint:recommended",
|
||||
"plugins": ["prettier"],
|
||||
"rules": {
|
||||
"prettier/prettier": "error",
|
||||
"mark-callable-contracts": "off",
|
||||
"bracket-align": "off",
|
||||
"not-rely-on-time": "off",
|
||||
"const-name-snakecase": "off",
|
||||
"no-inline-assembly": "off",
|
||||
"compiler-version": ["error", "0.4.24"]
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
contracts/kitty
|
12
README.md
12
README.md
|
@ -18,11 +18,17 @@ Create `.env` file in project root with the following parameters:
|
|||
DEPLOYMENT_ACCOUNT_PRIVATE_KEY=67..14
|
||||
# Extra gas added to the estimated gas of a particular deployment/configuration transaction
|
||||
DEPLOYMENT_GAS_LIMIT_EXTRA=0.2
|
||||
# The "gasPrice" parameter set in every deployment/configuration transaction on Foreign network (in Wei).
|
||||
FOREIGN_DEPLOYMENT_GAS_PRICE=1000000000
|
||||
# The RPC channel to a Home node able to handle deployment/configuration transactions.
|
||||
HOME_RPC_URL=https://sokol.poa.network
|
||||
# The "gasPrice" parameter set in every deployment/configuration transaction on Home network (in Wei).
|
||||
HOME_DEPLOYMENT_GAS_PRICE=1000000000
|
||||
# The RPC channel to a Foreign node able to handle deployment/configuration transactions.
|
||||
FOREIGN_RPC_URL=https://sokol.poa.network
|
||||
# Amount of Kitties to Mint
|
||||
# The "gasPrice" parameter set in every deployment/configuration transaction on Foreign network (in Wei).
|
||||
FOREIGN_DEPLOYMENT_GAS_PRICE=1000000000
|
||||
# Cryptokitties contract address on Foreign network. If not defined or set to address zero, the contract will be deployed on Foreign network.
|
||||
CRYPTOKITTIES_ADDRESS=0x0000000000000000000000000000000000000000
|
||||
# Amount of Kitties to Mint on Foreign network
|
||||
KITTIES_AMOUNT=1
|
||||
```
|
||||
|
||||
|
|
|
@ -50,8 +50,8 @@ contract KittyCore is KittyMinting {
|
|||
|
||||
/// @notice Creates the main CryptoKitties smart contract instance.
|
||||
function KittyCore() public {
|
||||
// Starts paused.
|
||||
paused = true;
|
||||
// Starts unpaused.
|
||||
paused = false;
|
||||
|
||||
// the creator of the contract is the initial CEO
|
||||
ceoAddress = msg.sender;
|
||||
|
|
|
@ -0,0 +1,141 @@
|
|||
pragma solidity 0.4.24;
|
||||
|
||||
contract SimpleKittyBase {
|
||||
/// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously
|
||||
/// includes any time a cat is created through the giveBirth method, but it is also called
|
||||
/// when a new gen0 cat is created.
|
||||
event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);
|
||||
|
||||
/// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten
|
||||
/// ownership is assigned, including births.
|
||||
event Transfer(address from, address to, uint256 tokenId);
|
||||
|
||||
/*** DATA TYPES ***/
|
||||
|
||||
/// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy
|
||||
/// of this structure, so great care was taken to ensure that it fits neatly into
|
||||
/// exactly two 256-bit words. Note that the order of the members in this structure
|
||||
/// is important because of the byte-packing rules used by Ethereum.
|
||||
/// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html
|
||||
struct Kitty {
|
||||
// The Kitty's genetic code is packed into these 256-bits, the format is
|
||||
// sooper-sekret! A cat's genes never change.
|
||||
uint256 genes;
|
||||
// The timestamp from the block when this cat came into existence.
|
||||
uint64 birthTime;
|
||||
// The minimum timestamp after which this cat can engage in breeding
|
||||
// activities again. This same timestamp is used for the pregnancy
|
||||
// timer (for matrons) as well as the siring cooldown.
|
||||
uint64 cooldownEndBlock;
|
||||
// The ID of the parents of this kitty, set to 0 for gen0 cats.
|
||||
// Note that using 32-bit unsigned integers limits us to a "mere"
|
||||
// 4 billion cats. This number might seem small until you realize
|
||||
// that Ethereum currently has a limit of about 500 million
|
||||
// transactions per year! So, this definitely won't be a problem
|
||||
// for several years (even as Ethereum learns to scale).
|
||||
uint32 matronId;
|
||||
uint32 sireId;
|
||||
// Set to the ID of the sire cat for matrons that are pregnant,
|
||||
// zero otherwise. A non-zero value here is how we know a cat
|
||||
// is pregnant. Used to retrieve the genetic material for the new
|
||||
// kitten when the birth transpires.
|
||||
uint32 siringWithId;
|
||||
// Set to the index in the cooldown array (see below) that represents
|
||||
// the current cooldown duration for this Kitty. This starts at zero
|
||||
// for gen0 cats, and is initialized to floor(generation/2) for others.
|
||||
// Incremented by one for each successful breeding action, regardless
|
||||
// of whether this cat is acting as matron or sire.
|
||||
uint16 cooldownIndex;
|
||||
// The "generation number" of this cat. Cats minted by the CK contract
|
||||
// for sale are called "gen0" and have a generation number of 0. The
|
||||
// generation number of all other cats is the larger of the two generation
|
||||
// numbers of their parents, plus one.
|
||||
// (i.e. max(matron.generation, sire.generation) + 1)
|
||||
uint16 generation;
|
||||
bool isReady;
|
||||
}
|
||||
|
||||
/*** STORAGE ***/
|
||||
|
||||
mapping(uint256 => Kitty) internal kitties;
|
||||
|
||||
uint256 internal kittyTotalSupply;
|
||||
|
||||
/// @dev A mapping from cat IDs to the address that owns them. All cats have
|
||||
/// some valid owner address, even gen0 cats are created with a non-zero owner.
|
||||
mapping(uint256 => address) public kittyIndexToOwner;
|
||||
|
||||
// @dev A mapping from owner address to count of tokens that address owns.
|
||||
// Used internally inside balanceOf() to resolve ownership count.
|
||||
mapping(address => uint256) internal ownershipTokenCount;
|
||||
|
||||
/// @dev A mapping from KittyIDs to an address that has been approved to call
|
||||
/// transferFrom(). Each Kitty can only have one approved address for transfer
|
||||
/// at any time. A zero value means no approval is outstanding.
|
||||
mapping(uint256 => address) public kittyIndexToApproved;
|
||||
|
||||
/// @dev Assigns ownership of a specific Kitty to an address.
|
||||
function _transfer(address _from, address _to, uint256 _tokenId) internal {
|
||||
// Since the number of kittens is capped to 2^32 we can't overflow this
|
||||
ownershipTokenCount[_to]++;
|
||||
// transfer ownership
|
||||
kittyIndexToOwner[_tokenId] = _to;
|
||||
// When creating new kittens _from is 0x0, but we can't account that address.
|
||||
if (_from != address(0)) {
|
||||
ownershipTokenCount[_from]--;
|
||||
// clear any previously approved ownership exchange
|
||||
delete kittyIndexToApproved[_tokenId];
|
||||
}
|
||||
// Emit the transfer event.
|
||||
Transfer(_from, _to, _tokenId);
|
||||
}
|
||||
|
||||
/// @dev An internal method that creates a new kitty and stores it.
|
||||
/// Receives all the data from getKitty method that was generated on Cryptokitties contract.
|
||||
/// Will generate both a Birth event and a Transfer event.
|
||||
/// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)
|
||||
function _createKitty(
|
||||
uint256 _tokenId,
|
||||
bool _isReady,
|
||||
uint256 _cooldownIndex,
|
||||
uint256 _nextActionAt,
|
||||
uint256 _siringWithId,
|
||||
uint256 _birthTime,
|
||||
uint256 _matronId,
|
||||
uint256 _sireId,
|
||||
uint256 _generation,
|
||||
uint256 _genes,
|
||||
address _owner
|
||||
) internal returns (uint256) {
|
||||
// These requires are not strictly necessary, our calling code should make
|
||||
// sure that these conditions are never broken. However! _createKitty() is already
|
||||
// an expensive call (for storage), and it doesn't hurt to be especially careful
|
||||
// to ensure our data structures are always valid.
|
||||
require(_matronId == uint256(uint32(_matronId)));
|
||||
require(_sireId == uint256(uint32(_sireId)));
|
||||
require(_generation == uint256(uint16(_generation)));
|
||||
|
||||
Kitty memory _kitty = Kitty({
|
||||
genes: _genes,
|
||||
birthTime: uint64(_birthTime),
|
||||
cooldownEndBlock: uint64(_nextActionAt),
|
||||
matronId: uint32(_matronId),
|
||||
sireId: uint32(_sireId),
|
||||
siringWithId: uint32(_siringWithId),
|
||||
cooldownIndex: uint16(_cooldownIndex),
|
||||
generation: uint16(_generation),
|
||||
isReady: _isReady
|
||||
});
|
||||
kitties[_tokenId] = _kitty;
|
||||
kittyTotalSupply++;
|
||||
|
||||
// emit the birth event
|
||||
Birth(_owner, _tokenId, uint256(_kitty.matronId), uint256(_kitty.sireId), _kitty.genes);
|
||||
|
||||
// This will assign ownership, and also emit the Transfer event as
|
||||
// per ERC721 draft
|
||||
_transfer(0, _owner, _tokenId);
|
||||
|
||||
return _tokenId;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
pragma solidity 0.4.24;
|
||||
|
||||
import "./SimpleKittyOwnership.sol";
|
||||
|
||||
contract SimpleKittyCore is SimpleKittyOwnership {
|
||||
/// @notice Returns all the relevant information about a specific kitty.
|
||||
/// @param _id The ID of the kitty of interest.
|
||||
function getKitty(uint256 _id)
|
||||
external
|
||||
view
|
||||
returns (
|
||||
bool isGestating,
|
||||
bool isReady,
|
||||
uint256 cooldownIndex,
|
||||
uint256 nextActionAt,
|
||||
uint256 siringWithId,
|
||||
uint256 birthTime,
|
||||
uint256 matronId,
|
||||
uint256 sireId,
|
||||
uint256 generation,
|
||||
uint256 genes
|
||||
)
|
||||
{
|
||||
Kitty storage kit = kitties[_id];
|
||||
|
||||
// if this variable is 0 then it's not gestating
|
||||
isGestating = (kit.siringWithId != 0);
|
||||
isReady = kit.isReady;
|
||||
cooldownIndex = uint256(kit.cooldownIndex);
|
||||
nextActionAt = uint256(kit.cooldownEndBlock);
|
||||
siringWithId = uint256(kit.siringWithId);
|
||||
birthTime = uint256(kit.birthTime);
|
||||
matronId = uint256(kit.matronId);
|
||||
sireId = uint256(kit.sireId);
|
||||
generation = uint256(kit.generation);
|
||||
genes = kit.genes;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,180 @@
|
|||
pragma solidity 0.4.24;
|
||||
|
||||
import "./SimpleKittyBase.sol";
|
||||
import "../kitty/ERC721.sol";
|
||||
|
||||
contract SimpleKittyOwnership is SimpleKittyBase, ERC721 {
|
||||
/// @notice Name and symbol of the non fungible token, as defined in ERC721.
|
||||
string public constant name = "CryptoKitties";
|
||||
string public constant symbol = "CK";
|
||||
|
||||
bytes4 internal constant InterfaceSignature_ERC165 = bytes4(keccak256("supportsInterface(bytes4)"));
|
||||
|
||||
bytes4 internal constant InterfaceSignature_ERC721 = bytes4(keccak256("name()")) ^
|
||||
bytes4(keccak256("symbol()")) ^
|
||||
bytes4(keccak256("totalSupply()")) ^
|
||||
bytes4(keccak256("balanceOf(address)")) ^
|
||||
bytes4(keccak256("ownerOf(uint256)")) ^
|
||||
bytes4(keccak256("approve(address,uint256)")) ^
|
||||
bytes4(keccak256("transfer(address,uint256)")) ^
|
||||
bytes4(keccak256("transferFrom(address,address,uint256)")) ^
|
||||
bytes4(keccak256("tokensOfOwner(address)")) ^
|
||||
bytes4(keccak256("tokenMetadata(uint256,string)"));
|
||||
|
||||
/// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
|
||||
/// Returns true for any standardized interfaces implemented by this contract. We implement
|
||||
/// ERC-165 (obviously!) and ERC-721.
|
||||
function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
|
||||
// DEBUG ONLY
|
||||
//require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));
|
||||
|
||||
return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));
|
||||
}
|
||||
|
||||
// Internal utility functions: These functions all assume that their input arguments
|
||||
// are valid. We leave it to public methods to sanitize their inputs and follow
|
||||
// the required logic.
|
||||
|
||||
/// @dev Checks if a given address is the current owner of a particular Kitty.
|
||||
/// @param _claimant the address we are validating against.
|
||||
/// @param _tokenId kitten id, only valid when > 0
|
||||
function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
|
||||
return kittyIndexToOwner[_tokenId] == _claimant;
|
||||
}
|
||||
|
||||
/// @dev Checks if a given address currently has transferApproval for a particular Kitty.
|
||||
/// @param _claimant the address we are confirming kitten is approved for.
|
||||
/// @param _tokenId kitten id, only valid when > 0
|
||||
function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
|
||||
return kittyIndexToApproved[_tokenId] == _claimant;
|
||||
}
|
||||
|
||||
/// @dev Marks an address as being approved for transferFrom(), overwriting any previous
|
||||
/// approval. Setting _approved to address(0) clears all transfer approval.
|
||||
/// NOTE: _approve() does NOT send the Approval event. This is intentional because
|
||||
/// _approve() and transferFrom() are used together for putting Kitties on auction, and
|
||||
/// there is no value in spamming the log with Approval events in that case.
|
||||
function _approve(uint256 _tokenId, address _approved) internal {
|
||||
kittyIndexToApproved[_tokenId] = _approved;
|
||||
}
|
||||
|
||||
/// @notice Returns the number of Kitties owned by a specific address.
|
||||
/// @param _owner The owner address to check.
|
||||
/// @dev Required for ERC-721 compliance
|
||||
function balanceOf(address _owner) public view returns (uint256 count) {
|
||||
return ownershipTokenCount[_owner];
|
||||
}
|
||||
|
||||
/// @notice Transfers a Kitty to another address. If transferring to a smart
|
||||
/// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or
|
||||
/// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.
|
||||
/// @param _to The address of the recipient, can be a user or contract.
|
||||
/// @param _tokenId The ID of the Kitty to transfer.
|
||||
/// @dev Required for ERC-721 compliance.
|
||||
function transfer(address _to, uint256 _tokenId) external {
|
||||
// Safety check to prevent against an unexpected 0x0 default.
|
||||
require(_to != address(0));
|
||||
// Disallow transfers to this contract to prevent accidental misuse.
|
||||
// The contract should never own any kitties (except very briefly
|
||||
// after a gen0 cat is created and before it goes on auction).
|
||||
require(_to != address(this));
|
||||
|
||||
// You can only send your own cat.
|
||||
require(_owns(msg.sender, _tokenId));
|
||||
|
||||
// Reassign ownership, clear pending approvals, emit Transfer event.
|
||||
_transfer(msg.sender, _to, _tokenId);
|
||||
}
|
||||
|
||||
/// @notice Grant another address the right to transfer a specific Kitty via
|
||||
/// transferFrom(). This is the preferred flow for transfering NFTs to contracts.
|
||||
/// @param _to The address to be granted transfer approval. Pass address(0) to
|
||||
/// clear all approvals.
|
||||
/// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.
|
||||
/// @dev Required for ERC-721 compliance.
|
||||
function approve(address _to, uint256 _tokenId) external {
|
||||
// Only an owner can grant transfer approval.
|
||||
require(_owns(msg.sender, _tokenId));
|
||||
|
||||
// Register the approval (replacing any previous approval).
|
||||
_approve(_tokenId, _to);
|
||||
|
||||
// Emit approval event.
|
||||
Approval(msg.sender, _to, _tokenId);
|
||||
}
|
||||
|
||||
/// @notice Transfer a Kitty owned by another address, for which the calling address
|
||||
/// has previously been granted transfer approval by the owner.
|
||||
/// @param _from The address that owns the Kitty to be transfered.
|
||||
/// @param _to The address that should take ownership of the Kitty. Can be any address,
|
||||
/// including the caller.
|
||||
/// @param _tokenId The ID of the Kitty to be transferred.
|
||||
/// @dev Required for ERC-721 compliance.
|
||||
function transferFrom(address _from, address _to, uint256 _tokenId) external {
|
||||
// Safety check to prevent against an unexpected 0x0 default.
|
||||
require(_to != address(0));
|
||||
// Disallow transfers to this contract to prevent accidental misuse.
|
||||
// The contract should never own any kitties (except very briefly
|
||||
// after a gen0 cat is created and before it goes on auction).
|
||||
require(_to != address(this));
|
||||
// Check for approval and valid ownership
|
||||
require(_approvedFor(msg.sender, _tokenId));
|
||||
require(_owns(_from, _tokenId));
|
||||
|
||||
// Reassign ownership (also clears pending approvals and emits Transfer event).
|
||||
_transfer(_from, _to, _tokenId);
|
||||
}
|
||||
|
||||
/// @notice Returns the total number of Kitties currently in existence.
|
||||
/// @dev Required for ERC-721 compliance.
|
||||
function totalSupply() public view returns (uint256) {
|
||||
return kittyTotalSupply;
|
||||
}
|
||||
|
||||
/// @notice Returns the address currently assigned ownership of a given Kitty.
|
||||
/// @dev Required for ERC-721 compliance.
|
||||
function ownerOf(uint256 _tokenId) external view returns (address owner) {
|
||||
owner = kittyIndexToOwner[_tokenId];
|
||||
|
||||
require(owner != address(0));
|
||||
}
|
||||
|
||||
/// @notice Returns a list of all Kitty IDs assigned to an address.
|
||||
/// @param _owner The owner whose Kitties we are interested in.
|
||||
/// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
|
||||
/// expensive (it walks the entire Kitty array looking for cats belonging to owner),
|
||||
/// but it also returns a dynamic array, which is only supported for web3 calls, and
|
||||
/// not contract-to-contract calls.
|
||||
function tokensOfOwner(address _owner) external view returns (uint256[] ownerTokens) {
|
||||
uint256 tokenCount = balanceOf(_owner);
|
||||
|
||||
if (tokenCount == 0) {
|
||||
// Return an empty array
|
||||
return new uint256[](0);
|
||||
} else {
|
||||
uint256[] memory result = new uint256[](tokenCount);
|
||||
uint256 totalCats = totalSupply();
|
||||
uint256 resultIndex = 0;
|
||||
|
||||
// We count on the fact that all cats have IDs starting at 1 and increasing
|
||||
// sequentially up to the totalCat count.
|
||||
uint256 catId;
|
||||
|
||||
for (catId = 1; catId <= totalCats; catId++) {
|
||||
if (kittyIndexToOwner[catId] == _owner) {
|
||||
result[resultIndex] = catId;
|
||||
resultIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/// @notice Returns a URI pointing to a metadata package for this token conforming to
|
||||
/// ERC-721 (https://github.com/ethereum/EIPs/issues/721)
|
||||
/// @param _tokenId The ID number of the Kitty whose metadata should be returned.
|
||||
function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string) {
|
||||
// solhint-disable-previous-line no-empty-blocks
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
const assert = require('assert')
|
||||
const Web3Utils = require('web3-utils')
|
||||
const kittyCore = require('../build/contracts/KittyCore')
|
||||
const {
|
||||
deployContract,
|
||||
privateKeyToAddress,
|
||||
web3Foreign,
|
||||
deploymentPrivateKey,
|
||||
sendRawTxForeign
|
||||
} = require('./deploymentUtils')
|
||||
|
||||
const { DEPLOYMENT_ACCOUNT_PRIVATE_KEY, CRYPTOKITTIES_ADDRESS, KITTIES_AMOUNT, FOREIGN_RPC_URL } = process.env
|
||||
|
||||
async function deployForeign() {
|
||||
const accountAddress = privateKeyToAddress(DEPLOYMENT_ACCOUNT_PRIVATE_KEY)
|
||||
let nonce = await web3Foreign.eth.getTransactionCount(accountAddress)
|
||||
let kittyCoreAddress = CRYPTOKITTIES_ADDRESS
|
||||
|
||||
if (!CRYPTOKITTIES_ADDRESS || CRYPTOKITTIES_ADDRESS === '0x0000000000000000000000000000000000000000') {
|
||||
// deploy contract
|
||||
console.log('[Foreign] Deploying kittyCore contract')
|
||||
const kittyCoreContract = await deployContract(kittyCore, [], {
|
||||
from: accountAddress,
|
||||
network: 'foreign',
|
||||
nonce
|
||||
})
|
||||
nonce++
|
||||
kittyCoreAddress = kittyCoreContract.options.address
|
||||
console.log('[Foreign] kittyCore Address: ', kittyCoreContract.options.address)
|
||||
|
||||
// mint kitties
|
||||
const kittiesAmount = Number(KITTIES_AMOUNT)
|
||||
if (kittiesAmount) {
|
||||
console.log('[Foreign] Minting kitties to', accountAddress)
|
||||
for (let i = 1; i <= kittiesAmount; i++) {
|
||||
const mintData = await kittyCoreContract.methods.createPromoKitty(i, accountAddress).encodeABI()
|
||||
const txMint = await sendRawTxForeign({
|
||||
data: mintData,
|
||||
nonce,
|
||||
to: kittyCoreContract.options.address,
|
||||
privateKey: deploymentPrivateKey,
|
||||
url: FOREIGN_RPC_URL
|
||||
})
|
||||
assert.strictEqual(Web3Utils.hexToNumber(txMint.status), 1, 'Transaction Failed')
|
||||
console.log(`[Foreign] Minted Kitty ID: ${i}`)
|
||||
nonce++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
kittyCore: kittyCoreAddress
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = deployForeign
|
|
@ -0,0 +1,24 @@
|
|||
const simpleKittyCore = require('../build/contracts/SimpleKittyCore')
|
||||
const { deployContract, privateKeyToAddress, web3Home } = require('./deploymentUtils')
|
||||
|
||||
const { DEPLOYMENT_ACCOUNT_PRIVATE_KEY } = process.env
|
||||
|
||||
async function deployHome() {
|
||||
const accountAddress = privateKeyToAddress(DEPLOYMENT_ACCOUNT_PRIVATE_KEY)
|
||||
const nonce = await web3Home.eth.getTransactionCount(accountAddress)
|
||||
|
||||
// deploy contract
|
||||
console.log('[Home] Deploying simpleKittyCore contract')
|
||||
const simpleKittyCoreContract = await deployContract(simpleKittyCore, [], {
|
||||
from: accountAddress,
|
||||
network: 'home',
|
||||
nonce
|
||||
})
|
||||
console.log('[Home] simpleKittyCore Address: ', simpleKittyCoreContract.options.address)
|
||||
|
||||
return {
|
||||
simpleKittyCore: simpleKittyCoreContract.options.address
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = deployHome
|
|
@ -1,48 +1,12 @@
|
|||
const assert = require('assert')
|
||||
const Web3Utils = require('web3-utils')
|
||||
const kittyCore = require('../build/contracts/KittyCore')
|
||||
const {
|
||||
deployContract,
|
||||
privateKeyToAddress,
|
||||
web3Foreign,
|
||||
deploymentPrivateKey,
|
||||
sendRawTxForeign
|
||||
} = require('./deploymentUtils')
|
||||
|
||||
const { DEPLOYMENT_ACCOUNT_PRIVATE_KEY, KITTIES_AMOUNT, FOREIGN_RPC_URL } = process.env
|
||||
const deployHome = require('./home')
|
||||
const deployForeign = require('./foreign')
|
||||
|
||||
async function main() {
|
||||
const accountAddress = privateKeyToAddress(DEPLOYMENT_ACCOUNT_PRIVATE_KEY)
|
||||
let nonce = await web3Foreign.eth.getTransactionCount(accountAddress)
|
||||
|
||||
// deploy contract
|
||||
console.log('Deploying kittyCore contract')
|
||||
const kittyCoreContract = await deployContract(kittyCore, [], {
|
||||
from: accountAddress,
|
||||
network: 'foreign',
|
||||
nonce
|
||||
})
|
||||
nonce++
|
||||
console.log('kittyCore Address: ', kittyCoreContract.options.address)
|
||||
|
||||
// mint kitties
|
||||
const kittiesAmount = Number(KITTIES_AMOUNT)
|
||||
if (kittiesAmount) {
|
||||
console.log('Minting kitties to', accountAddress)
|
||||
for (let i = 1; i <= kittiesAmount; i++) {
|
||||
const mintData = await kittyCoreContract.methods.createPromoKitty(i, accountAddress).encodeABI()
|
||||
const txMint = await sendRawTxForeign({
|
||||
data: mintData,
|
||||
nonce,
|
||||
to: kittyCoreContract.options.address,
|
||||
privateKey: deploymentPrivateKey,
|
||||
url: FOREIGN_RPC_URL
|
||||
})
|
||||
assert.strictEqual(Web3Utils.hexToNumber(txMint.status), 1, 'Transaction Failed')
|
||||
console.log(`Minted Kitty ID: ${i}`)
|
||||
nonce++
|
||||
}
|
||||
}
|
||||
const { simpleKittyCore } = await deployHome()
|
||||
const { kittyCore } = await deployForeign()
|
||||
console.log('\nDeployment has been completed.\n')
|
||||
console.log(`[ Home ] simpleKittyCore: ${simpleKittyCore}`)
|
||||
console.log(`[ Foreign ] kittyCore: ${kittyCore}`)
|
||||
}
|
||||
|
||||
main().catch(e => console.log(e))
|
||||
|
|
|
@ -7,7 +7,11 @@
|
|||
"compile": "truffle compile",
|
||||
"flatten": "bash scripts/flatten.sh",
|
||||
"deploy": "node deploy/index.js",
|
||||
"lint": "eslint ."
|
||||
"lint": "npm run lint:js && npm run lint:sol",
|
||||
"lint:js": "eslint .",
|
||||
"lint:js:fix": "eslint . --fix",
|
||||
"lint:sol": "solhint --max-warnings 0 \"contracts/**/*.sol\"",
|
||||
"lint:sol:prettier:fix": "prettier --write **/*.sol"
|
||||
},
|
||||
"dependencies": {
|
||||
"bignumber.js": "^9.0.0",
|
||||
|
@ -26,6 +30,9 @@
|
|||
"eslint-plugin-node": "^10.0.0",
|
||||
"eslint-plugin-prettier": "^3.1.0",
|
||||
"prettier": "^1.18.2",
|
||||
"prettier-plugin-solidity": "^1.0.0-alpha.32",
|
||||
"solhint": "^2.2.0",
|
||||
"solhint-plugin-prettier": "^0.0.3",
|
||||
"truffle-flattener": "^1.4.2"
|
||||
},
|
||||
"engines": {
|
||||
|
|
|
@ -5,6 +5,7 @@ if [ -d flats ]; then
|
|||
fi
|
||||
|
||||
mkdir -p flats/kitty
|
||||
mkdir -p flats/simpleKitty
|
||||
|
||||
FLATTENER=./node_modules/.bin/truffle-flattener
|
||||
KITTY_CONTRACTS_DIR=contracts/kitty
|
||||
|
@ -15,3 +16,4 @@ ${FLATTENER} ${KITTY_CONTRACTS_DIR}/KittyCore.sol > flats/kitty/KittyCore_flat.s
|
|||
${FLATTENER} ${KITTY_CONTRACTS_DIR}/GeneScience.sol > flats/kitty/GeneScience_flat.sol
|
||||
${FLATTENER} ${KITTY_CONTRACTS_DIR}/SaleClockAuction.sol > flats/kitty/SaleClockAuction_flat.sol
|
||||
${FLATTENER} ${KITTY_CONTRACTS_DIR}/SiringClockAuction.sol > flats/kitty/SiringClockAuction_flat.sol
|
||||
${FLATTENER} contracts/simpleKitty/SimpleKittyCore.sol > flats/simpleKitty/SimpleKittyCore_flat.sol
|
||||
|
|
|
@ -85,7 +85,7 @@ module.exports = {
|
|||
version: '0.4.24',
|
||||
settings: {
|
||||
optimizer: {
|
||||
enabled: false,
|
||||
enabled: true,
|
||||
runs: 200
|
||||
},
|
||||
evmVersion: 'byzantium'
|
||||
|
|
256
yarn.lock
256
yarn.lock
|
@ -77,11 +77,16 @@ accepts@~1.3.7:
|
|||
mime-types "~2.1.24"
|
||||
negotiator "0.6.2"
|
||||
|
||||
acorn-jsx@^5.0.2:
|
||||
acorn-jsx@^5.0.0, acorn-jsx@^5.0.2:
|
||||
version "5.0.2"
|
||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f"
|
||||
integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==
|
||||
|
||||
acorn@^6.0.7:
|
||||
version "6.3.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
|
||||
integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
|
||||
|
||||
acorn@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a"
|
||||
|
@ -92,7 +97,7 @@ aes-js@3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
|
||||
integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=
|
||||
|
||||
ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5:
|
||||
ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.6.1, ajv@^6.9.1:
|
||||
version "6.10.2"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
|
||||
integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
|
||||
|
@ -124,6 +129,11 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
|
|||
dependencies:
|
||||
color-convert "^1.9.0"
|
||||
|
||||
antlr4@4.7.1:
|
||||
version "4.7.1"
|
||||
resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773"
|
||||
integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==
|
||||
|
||||
any-promise@1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
|
||||
|
@ -412,6 +422,25 @@ cacheable-request@^6.0.0:
|
|||
normalize-url "^4.1.0"
|
||||
responselike "^1.0.2"
|
||||
|
||||
caller-callsite@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
|
||||
integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
|
||||
dependencies:
|
||||
callsites "^2.0.0"
|
||||
|
||||
caller-path@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
|
||||
integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
|
||||
dependencies:
|
||||
caller-callsite "^2.0.0"
|
||||
|
||||
callsites@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
|
||||
integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
|
||||
|
||||
callsites@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
|
||||
|
@ -492,6 +521,11 @@ commander@2.15.1:
|
|||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
||||
integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
|
||||
|
||||
commander@2.18.0:
|
||||
version "2.18.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970"
|
||||
integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==
|
||||
|
||||
commander@~2.8.1:
|
||||
version "2.8.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
|
||||
|
@ -554,6 +588,16 @@ cors@^2.8.1:
|
|||
object-assign "^4"
|
||||
vary "^1"
|
||||
|
||||
cosmiconfig@^5.0.7:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
|
||||
integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
|
||||
dependencies:
|
||||
import-fresh "^2.0.0"
|
||||
is-directory "^0.3.1"
|
||||
js-yaml "^3.13.1"
|
||||
parse-json "^4.0.0"
|
||||
|
||||
create-ecdh@^4.0.0:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
|
||||
|
@ -775,6 +819,11 @@ diffie-hellman@^5.0.0:
|
|||
miller-rabin "^4.0.0"
|
||||
randombytes "^2.0.0"
|
||||
|
||||
dir-to-object@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/dir-to-object/-/dir-to-object-2.0.0.tgz#29723e9bd1c3e58e4f307bd04ff634c0370c8f8a"
|
||||
integrity sha512-sXs0JKIhymON7T1UZuO2Ud6VTNAx/VTBXIl4+3mjb2RgfOpt+hectX0x04YqPOPdkeOAKoJuKqwqnXXURNPNEA==
|
||||
|
||||
doctrine@1.5.0:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
|
||||
|
@ -855,6 +904,11 @@ emoji-regex@^7.0.1:
|
|||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
|
||||
integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
|
||||
|
||||
emoji-regex@^8.0.0:
|
||||
version "8.0.0"
|
||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
|
||||
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
|
||||
|
||||
encodeurl@~1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
|
||||
|
@ -867,7 +921,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
|
|||
dependencies:
|
||||
once "^1.4.0"
|
||||
|
||||
error-ex@^1.2.0:
|
||||
error-ex@^1.2.0, error-ex@^1.3.1:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
|
||||
integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
|
||||
|
@ -935,6 +989,11 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5:
|
|||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
||||
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
|
||||
|
||||
escape-string-regexp@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
|
||||
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
|
||||
|
||||
eslint-config-airbnb-base@^14.0.0:
|
||||
version "14.0.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz#8a7bcb9643d13c55df4dd7444f138bf4efa61e17"
|
||||
|
@ -1011,6 +1070,14 @@ eslint-plugin-prettier@^3.1.0:
|
|||
dependencies:
|
||||
prettier-linter-helpers "^1.0.0"
|
||||
|
||||
eslint-scope@^4.0.3:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
|
||||
integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
|
||||
dependencies:
|
||||
esrecurse "^4.1.0"
|
||||
estraverse "^4.1.1"
|
||||
|
||||
eslint-scope@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9"
|
||||
|
@ -1019,7 +1086,7 @@ eslint-scope@^5.0.0:
|
|||
esrecurse "^4.1.0"
|
||||
estraverse "^4.1.1"
|
||||
|
||||
eslint-utils@^1.4.2:
|
||||
eslint-utils@^1.3.1, eslint-utils@^1.4.2:
|
||||
version "1.4.2"
|
||||
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
|
||||
integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==
|
||||
|
@ -1031,6 +1098,48 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
|
|||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
|
||||
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
|
||||
|
||||
eslint@^5.6.0:
|
||||
version "5.16.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
|
||||
integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.0.0"
|
||||
ajv "^6.9.1"
|
||||
chalk "^2.1.0"
|
||||
cross-spawn "^6.0.5"
|
||||
debug "^4.0.1"
|
||||
doctrine "^3.0.0"
|
||||
eslint-scope "^4.0.3"
|
||||
eslint-utils "^1.3.1"
|
||||
eslint-visitor-keys "^1.0.0"
|
||||
espree "^5.0.1"
|
||||
esquery "^1.0.1"
|
||||
esutils "^2.0.2"
|
||||
file-entry-cache "^5.0.1"
|
||||
functional-red-black-tree "^1.0.1"
|
||||
glob "^7.1.2"
|
||||
globals "^11.7.0"
|
||||
ignore "^4.0.6"
|
||||
import-fresh "^3.0.0"
|
||||
imurmurhash "^0.1.4"
|
||||
inquirer "^6.2.2"
|
||||
js-yaml "^3.13.0"
|
||||
json-stable-stringify-without-jsonify "^1.0.1"
|
||||
levn "^0.3.0"
|
||||
lodash "^4.17.11"
|
||||
minimatch "^3.0.4"
|
||||
mkdirp "^0.5.1"
|
||||
natural-compare "^1.4.0"
|
||||
optionator "^0.8.2"
|
||||
path-is-inside "^1.0.2"
|
||||
progress "^2.0.0"
|
||||
regexpp "^2.0.1"
|
||||
semver "^5.5.1"
|
||||
strip-ansi "^4.0.0"
|
||||
strip-json-comments "^2.0.1"
|
||||
table "^5.2.3"
|
||||
text-table "^0.2.0"
|
||||
|
||||
eslint@^6.4.0:
|
||||
version "6.4.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.4.0.tgz#5aa9227c3fbe921982b2eda94ba0d7fae858611a"
|
||||
|
@ -1074,6 +1183,15 @@ eslint@^6.4.0:
|
|||
text-table "^0.2.0"
|
||||
v8-compile-cache "^2.0.3"
|
||||
|
||||
espree@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
|
||||
integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
|
||||
dependencies:
|
||||
acorn "^6.0.7"
|
||||
acorn-jsx "^5.0.0"
|
||||
eslint-visitor-keys "^1.0.0"
|
||||
|
||||
espree@^6.1.1:
|
||||
version "6.1.1"
|
||||
resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de"
|
||||
|
@ -1083,6 +1201,13 @@ espree@^6.1.1:
|
|||
acorn-jsx "^5.0.2"
|
||||
eslint-visitor-keys "^1.1.0"
|
||||
|
||||
esprima-extract-comments@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/esprima-extract-comments/-/esprima-extract-comments-1.1.0.tgz#0dacab567a5900240de6d344cf18c33617becbc9"
|
||||
integrity sha512-sBQUnvJwpeE9QnPrxh7dpI/dp67erYG4WXEAreAMoelPRpMR7NWb4YtwRPn9b+H1uLQKl/qS8WYmyaljTpjIsw==
|
||||
dependencies:
|
||||
esprima "^4.0.0"
|
||||
|
||||
esprima@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
||||
|
@ -1268,6 +1393,14 @@ external-editor@^3.0.3:
|
|||
iconv-lite "^0.4.24"
|
||||
tmp "^0.0.33"
|
||||
|
||||
extract-comments@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/extract-comments/-/extract-comments-1.1.0.tgz#b90bca033a056bd69b8ba1c6b6b120fc2ee95c18"
|
||||
integrity sha512-dzbZV2AdSSVW/4E7Ti5hZdHWbA+Z80RJsJhr5uiL10oyjl/gy7/o+HI1HwK4/WSZhlq4SNKU3oUzXlM13Qx02Q==
|
||||
dependencies:
|
||||
esprima-extract-comments "^1.1.0"
|
||||
parse-code-context "^1.0.0"
|
||||
|
||||
extsprintf@1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
|
||||
|
@ -1498,7 +1631,7 @@ glob@7.1.2:
|
|||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@^7.1.3:
|
||||
glob@^7.1.2, glob@^7.1.3:
|
||||
version "7.1.4"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
|
||||
integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
|
||||
|
@ -1730,6 +1863,14 @@ ignore@^5.1.1:
|
|||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
|
||||
integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
|
||||
|
||||
import-fresh@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
|
||||
integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
|
||||
dependencies:
|
||||
caller-path "^2.0.0"
|
||||
resolve-from "^3.0.0"
|
||||
|
||||
import-fresh@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118"
|
||||
|
@ -1761,7 +1902,7 @@ inherits@2.0.3:
|
|||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
||||
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
||||
|
||||
inquirer@^6.4.1:
|
||||
inquirer@^6.2.2, inquirer@^6.4.1:
|
||||
version "6.5.2"
|
||||
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
|
||||
integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
|
||||
|
@ -1800,6 +1941,11 @@ is-date-object@^1.0.1:
|
|||
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
|
||||
integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
|
||||
|
||||
is-directory@^0.3.1:
|
||||
version "0.3.1"
|
||||
resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
|
||||
integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
|
||||
|
||||
is-extglob@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
|
||||
|
@ -1810,6 +1956,11 @@ is-fullwidth-code-point@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
|
||||
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
|
||||
|
||||
is-fullwidth-code-point@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
|
||||
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
|
||||
|
||||
is-function@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
|
||||
|
@ -1914,7 +2065,7 @@ js-tokens@^4.0.0:
|
|||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
||||
|
||||
js-yaml@^3.13.1:
|
||||
js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1:
|
||||
version "3.13.1"
|
||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
|
||||
integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
|
||||
|
@ -1932,6 +2083,11 @@ json-buffer@3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
|
||||
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
|
||||
|
||||
json-parse-better-errors@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
|
||||
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
|
||||
|
||||
json-schema-traverse@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
||||
|
@ -2020,7 +2176,7 @@ locate-path@^2.0.0:
|
|||
p-locate "^2.0.0"
|
||||
path-exists "^3.0.0"
|
||||
|
||||
lodash@^4.17.12, lodash@^4.17.14:
|
||||
lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14:
|
||||
version "4.17.15"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
|
||||
|
@ -2424,6 +2580,11 @@ parse-asn1@^5.0.0:
|
|||
pbkdf2 "^3.0.3"
|
||||
safe-buffer "^5.1.1"
|
||||
|
||||
parse-code-context@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/parse-code-context/-/parse-code-context-1.0.0.tgz#718c295c593d0d19a37f898473268cc75e98de1e"
|
||||
integrity sha512-OZQaqKaQnR21iqhlnPfVisFjBWjhnMl5J9MgbP8xC+EwoVqbXrq78lp+9Zb3ahmLzrIX5Us/qbvBnaS3hkH6OA==
|
||||
|
||||
parse-headers@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34"
|
||||
|
@ -2439,6 +2600,14 @@ parse-json@^2.2.0:
|
|||
dependencies:
|
||||
error-ex "^1.2.0"
|
||||
|
||||
parse-json@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
|
||||
integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
|
||||
dependencies:
|
||||
error-ex "^1.3.1"
|
||||
json-parse-better-errors "^1.0.1"
|
||||
|
||||
parseurl@~1.3.3:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
|
||||
|
@ -2454,6 +2623,11 @@ path-is-absolute@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
||||
|
||||
path-is-inside@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
|
||||
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
|
||||
|
||||
path-key@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
|
||||
|
@ -2548,7 +2722,21 @@ prettier-linter-helpers@^1.0.0:
|
|||
dependencies:
|
||||
fast-diff "^1.1.2"
|
||||
|
||||
prettier@^1.18.2:
|
||||
prettier-plugin-solidity@^1.0.0-alpha.32:
|
||||
version "1.0.0-alpha.32"
|
||||
resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-alpha.32.tgz#8ee8173541798f4f0bb66d536967152161f22855"
|
||||
integrity sha512-3gwIeiHyYUzPw9uLGrRTdYNd/3lmF8hUJtl7Dxygx6zHQ4NLP+uKE79MeCg49THFkLBcyJ+jYK1Wsk5fp+i2mA==
|
||||
dependencies:
|
||||
dir-to-object "^2.0.0"
|
||||
emoji-regex "^8.0.0"
|
||||
escape-string-regexp "^2.0.0"
|
||||
extract-comments "^1.1.0"
|
||||
prettier "^1.15.3"
|
||||
semver "^6.3.0"
|
||||
solidity-parser-antlr "^0.4.11"
|
||||
string-width "^4.1.0"
|
||||
|
||||
prettier@^1.14.3, prettier@^1.15.3, prettier@^1.18.2:
|
||||
version "1.18.2"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
|
||||
integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
|
||||
|
@ -2736,6 +2924,11 @@ request@^2.79.0, request@^2.85.0:
|
|||
tunnel-agent "^0.6.0"
|
||||
uuid "^3.3.2"
|
||||
|
||||
resolve-from@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
|
||||
integrity sha1-six699nWiBvItuZTM17rywoYh0g=
|
||||
|
||||
resolve-from@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
|
||||
|
@ -2846,7 +3039,7 @@ seek-bzip@^1.0.5:
|
|||
dependencies:
|
||||
commander "~2.8.1"
|
||||
|
||||
"semver@2 || 3 || 4 || 5", semver@^5.5.0:
|
||||
"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
||||
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
||||
|
@ -2856,7 +3049,7 @@ semver@6.2.0:
|
|||
resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db"
|
||||
integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==
|
||||
|
||||
semver@^6.1.0, semver@^6.1.2:
|
||||
semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0:
|
||||
version "6.3.0"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
|
||||
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
|
||||
|
@ -2971,6 +3164,33 @@ slice-ansi@^2.1.0:
|
|||
astral-regex "^1.0.0"
|
||||
is-fullwidth-code-point "^2.0.0"
|
||||
|
||||
solhint-plugin-prettier@^0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.3.tgz#d0070ef77d75fa8ede12574a81eca34f89c4a721"
|
||||
integrity sha512-kdg1c7d5/X/RKTBS9AskwAKOZLpFhwUBelwjrUq43EQXOLd2HR81WvENZWcVNmzewiPTEOoZo3CqqE/Hy/84WQ==
|
||||
dependencies:
|
||||
prettier-linter-helpers "^1.0.0"
|
||||
|
||||
solhint@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/solhint/-/solhint-2.2.0.tgz#c9ea75b8c2a5a9f4ec8f16d813c7efd851614273"
|
||||
integrity sha512-KNi9qGu17XNV75q9eFftrWIpDVHbejyZ5vaDuNQwet0e9+k8Xw0BdckyVUjYRfFQXAQA3nBTafxUVUtkM4cfIA==
|
||||
dependencies:
|
||||
ajv "^6.6.1"
|
||||
antlr4 "4.7.1"
|
||||
chalk "^2.4.2"
|
||||
commander "2.18.0"
|
||||
cosmiconfig "^5.0.7"
|
||||
eslint "^5.6.0"
|
||||
fast-diff "^1.1.2"
|
||||
glob "^7.1.3"
|
||||
ignore "^4.0.6"
|
||||
js-yaml "^3.12.0"
|
||||
lodash "^4.17.11"
|
||||
semver "^6.0.0"
|
||||
optionalDependencies:
|
||||
prettier "^1.14.3"
|
||||
|
||||
solidity-parser-antlr@^0.4.11:
|
||||
version "0.4.11"
|
||||
resolved "https://registry.yarnpkg.com/solidity-parser-antlr/-/solidity-parser-antlr-0.4.11.tgz#af43e1f13b3b88309a875455f5d6e565b05ee5f1"
|
||||
|
@ -3049,6 +3269,15 @@ string-width@^3.0.0:
|
|||
is-fullwidth-code-point "^2.0.0"
|
||||
strip-ansi "^5.1.0"
|
||||
|
||||
string-width@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff"
|
||||
integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==
|
||||
dependencies:
|
||||
emoji-regex "^8.0.0"
|
||||
is-fullwidth-code-point "^3.0.0"
|
||||
strip-ansi "^5.2.0"
|
||||
|
||||
string.prototype.trim@^1.1.2:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d"
|
||||
|
@ -3114,6 +3343,11 @@ strip-hex-prefix@1.0.0:
|
|||
dependencies:
|
||||
is-hex-prefixed "1.0.0"
|
||||
|
||||
strip-json-comments@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
|
||||
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
|
||||
|
||||
strip-json-comments@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
|
||||
|
|
Loading…
Reference in New Issue