Quick proof of concept for my boi @codyb and all the cryptokeepers at Definitely Friends
-
It's @dhof's beautiful little LOOT contract
-
But with the flattened OpenZeppelin contracts extracted back into their original
imports
, for cleanliness -
Then a healthy dose of
npx hardhat
boilerplate (Advanced Example) which is A Pretty Great Way To Write Solidity -
And then this brilliant README
-
Good luck, we're all counting on you
Checkout this repo and install dependencies
git clone https://github.com/jamiew/loot-fork
cd loot-fork
npm install
compile the contract and deploy to the internal hardhat
network
npx hardhat compile
npx hardhat run scripts/deploy.js
a real example requires you to run a local Ganache blockchain simulator (AKA the localhost
network, chainId 31337
):
# in one terminal, run a lil blockchain
npx hardhat node --show-stack-traces
# in another terminal, deploy the contract and copy the deployed address
npx hardhat run --network localhost scripts/deploy.js
then start npx hardhat console
and you can interact with said contract
npx hardhat console --network localhost
in the console, connect to our newly deployed LootFork
:
const Contract = await ethers.getContractFactory('LootFork');
const contract = await Contract.attach("ADDRESS_FROM_DEPLOYMENT_GOES_HERE");
then let's call some contract methods:
(await contract.name()).toString()
// 'LootFork'
(await contract.totalSupply()).toString();
// '0'
// (because we haven't minted anything yet)
(await contract.getWeapon(1)).toString();
// '"Grim Shout" Grave Wand of Skill +1'
if you want some loots, mint them to one of the default accounts setup by hardhat node
(ganache). they cryptorich, they got like 10k ETH each
let tokenId = 1;
let account = (await ethers.getSigners())[0];
let txn = (await contract.connect(account).claim(tokenId));
let receipt = (await txn.wait());
console.log(receipt.events[0].args)
/*
[
from: '0x0000000000000000000000000000000000000000',
to: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
tokenId: BigNumber { _hex: '0x03', _isBigNumber: true }
]
*/
did it work though?
(await contract.totalSupply()).toString();
// '1'
(await contract.tokenURI(1));
// 'data:application/json;base64,eyJuYW1lIjogIkJhZyAjMSIsICJkZXNjcmlwdGlvbiI6ICJMb290IGlzIHJhbmRvbWl6ZWQgYWR2ZW50dXJlciBnZWFyIGdlbmVyYXRlZCBhbmQgc3RvcmVkIG9uIGNoYWluLiBTdGF0cywgaW1hZ2VzLCBhbmQgb3RoZXIgZnVuY3Rpb25hbGl0eSBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkIGZvciBvdGhlcnMgdG8gaW50ZXJwcmV0LiBGZWVsIGZyZWUgdG8gdXNlIExvb3QgaW4gYW55IHdheSB5b3Ugd2FudC4iLCAiaW1hZ2UiOiAiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhCeVpYTmxjblpsUVhOd1pXTjBVbUYwYVc4OUluaE5hVzVaVFdsdUlHMWxaWFFpSUhacFpYZENiM2c5SWpBZ01DQXpOVEFnTXpVd0lqNDhjM1I1YkdVK0xtSmhjMlVnZXlCbWFXeHNPaUIzYUdsMFpUc2dabTl1ZEMxbVlXMXBiSGs2SUhObGNtbG1PeUJtYjI1MExYTnBlbVU2SURFMGNIZzdJSDA4TDNOMGVXeGxQanh5WldOMElIZHBaSFJvUFNJeE1EQWxJaUJvWldsbmFIUTlJakV3TUNVaUlHWnBiR3c5SW1Kc1lXTnJJaUF2UGp4MFpYaDBJSGc5SWpFd0lpQjVQU0l5TUNJZ1kyeGhjM005SW1KaGMyVWlQaUpIY21sdElGTm9iM1YwSWlCSGNtRjJaU0JYWVc1a0lHOW1JRk5yYVd4c0lDc3hQQzkwWlhoMFBqeDBaWGgwSUhnOUlqRXdJaUI1UFNJME1DSWdZMnhoYzNNOUltSmhjMlVpUGtoaGNtUWdUR1ZoZEdobGNpQkJjbTF2Y2p3dmRHVjRkRDQ4ZEdWNGRDQjRQU0l4TUNJZ2VUMGlOakFpSUdOc1lYTnpQU0ppWVhObElqNUVhWFpwYm1VZ1NHOXZaRHd2ZEdWNGRENDhkR1Y0ZENCNFBTSXhNQ0lnZVQwaU9EQWlJR05zWVhOelBTSmlZWE5sSWo1SVlYSmtJRXhsWVhSb1pYSWdRbVZzZER3dmRHVjRkRDQ4ZEdWNGRDQjRQU0l4TUNJZ2VUMGlNVEF3SWlCamJHRnpjejBpWW1GelpTSStJa1JsWVhSb0lGSnZiM1FpSUU5eWJtRjBaU0JIY21WaGRtVnpJRzltSUZOcmFXeHNQQzkwWlhoMFBqeDBaWGgwSUhnOUlqRXdJaUI1UFNJeE1qQWlJR05zWVhOelBTSmlZWE5sSWo1VGRIVmtaR1ZrSUV4bFlYUm9aWElnUjJ4dmRtVnpQQzkwWlhoMFBqeDBaWGgwSUhnOUlqRXdJaUI1UFNJeE5EQWlJR05zWVhOelBTSmlZWE5sSWo1T1pXTnJiR0ZqWlNCdlppQkZibXhwWjJoMFpXNXRaVzUwUEM5MFpYaDBQangwWlhoMElIZzlJakV3SWlCNVBTSXhOakFpSUdOc1lYTnpQU0ppWVhObElqNUhiMnhrSUZKcGJtYzhMM1JsZUhRK1BDOXpkbWMrIn0='
looks good to me
congratulations jeffrey bezos u did it
or perhaps start with rinkeby, my favorite testnet
This largely requires funding a wallet and registering API keys with Alchemy and Etherscan
Copy .env.sample
to .env
and edit in your keys
Then:
npx hardhat run scripts/deploy.js --network rinkeby
you can interact with this contract via npx hardhat console
the same way as above, just substitute --network rinkeby
for --network localhost
You can also use the hardhat-etherscan-verify
plugin to verify the contract on Etherscan, which is required to be truly eleet
npx hardhat verify --network rinkeby <YOUR_CONTRACT_ADDRESS>
Substitute mainnet
for rinkeby
to deploy for realsies. good luck