Make minter trigger backend

This commit is contained in:
Mentor Palokaj 2021-10-30 11:07:14 +02:00
parent bc183ea8a4
commit b5dfc95c4c
6 changed files with 2310 additions and 17 deletions

View File

@ -33,15 +33,15 @@ contract Rocketeer is ERC721Tradable {
// TODO: add Api data // TODO: add Api data
// https://docs.opensea.io/docs/metadata-standards // https://docs.opensea.io/docs/metadata-standards
function baseTokenURI() override public pure returns (string memory) { function baseTokenURI() override public pure returns (string memory) {
// return "https://rocketeer.fans/testnetapi/rocketeer/"; return "https://rocketeer.fans/testnetapi/rocketeer/";
return "https://rocketeer.fans/api/rocketeer/"; // return "https://rocketeer.fans/api/rocketeer/";
} }
// TODO: add API link // TODO: add API link
// https://docs.opensea.io/docs/contract-level-metadata // https://docs.opensea.io/docs/contract-level-metadata
function contractURI() public pure returns (string memory) { function contractURI() public pure returns (string memory) {
// return "https://rocketeer.fans/testnetapi/collection/"; return "https://rocketeer.fans/testnetapi/collection/";
return "https://rocketeer.fans/api/rocketeer/"; // return "https://rocketeer.fans/api/rocketeer/";
} }
// /////////////////////////////// // ///////////////////////////////

View File

@ -15,6 +15,7 @@ export default function Minter() {
const [ loading, setLoading ] = useState( false ) const [ loading, setLoading ] = useState( false )
const [ error, setError ] = useState( undefined ) const [ error, setError ] = useState( undefined )
const [ mintedTokenId, setMintedTokenId ] = useState( undefined ) const [ mintedTokenId, setMintedTokenId ] = useState( undefined )
const [ txHash, setTxhash ] = useState( null )
const totalSupply = useTotalSupply( ) const totalSupply = useTotalSupply( )
const address = useAddress() const address = useAddress()
const chainId = useChainId() const chainId = useChainId()
@ -36,7 +37,7 @@ export default function Minter() {
setLoading( 'Confirm transaction in metamask' ) setLoading( 'Confirm transaction in metamask' )
const response = await contract.spawnRocketeer( address ) const response = await contract.spawnRocketeer( address )
log( 'Successful mint with: ', response ) log( 'Successful mint with: ', response )
setTxhash( response.hash )
setLoading( 'Waiting for confirmations...' ) setLoading( 'Waiting for confirmations...' )
} catch( e ) { } catch( e ) {
@ -54,16 +55,24 @@ export default function Minter() {
try { try {
// Get confirmation details
log( `useEffect: Transfer ${ from } sent to ${ to } `, amount, event ) log( `useEffect: Transfer ${ from } sent to ${ to } `, amount, event )
const [ transFrom, transTo, tokenId ] = event.args const [ transFrom, transTo, tokenId ] = event.args
setMintedTokenId( tokenId.toString() ) const id = tokenId.toString()
// Trigger remote generation
const rocketeer = await fetch( `https://rocketeer.fans/${ chainId === 'api' ? '' : 'testnetapi'}/rocketeer/${id}` ).then( res => res.json() )
log( 'Oracle returned: ', rocketeer )
// Set token to state
setMintedTokenId( id )
setLoading( false ) setLoading( false )
} catch( e ) { } catch( e ) {
log( 'Error getting Transfer event from contract: ', e ) log( 'Error getting Transfer event from contract: ', e )
} }
} ), [ contract, loading ] ) } ), [ contract, loading, chainId ] )
// /////////////////////////////// // ///////////////////////////////
// Rendering // Rendering
@ -75,6 +84,7 @@ export default function Minter() {
<div className="lds-dual-ring"></div> <div className="lds-dual-ring"></div>
<p>{ loading }</p> <p>{ loading }</p>
{ txHash && <a className="button" rel='noreferrer' target="_blank" href={ `https://${ chainId === '0x01' ? 'etherscan' : 'rinkeby.etherscan' }.io/tx/${ txHash }` }>View tx on Etherscan</a> }
</div> } </div> }
</Container> </Container>

View File

@ -31,12 +31,17 @@ export async function getAddress() {
export function useAddress() { export function useAddress() {
const [ address, setAddress ] = useState( undefined ) const [ address, setAddress ] = useState( undefined )
const [ interval, setInterval ] = useState( 5000 ) const [ interval, setInterval ] = useState( 1000 )
const [ timesChecked, setTimesChecked ] = useState( 0 )
useInterval( () => { useInterval( () => {
setTimesChecked( timesChecked++ )
log( 'Checking for address' ) log( 'Checking for address' )
if( window.ethereum && window.ethereum.selectedAddress ) setAddress( window.ethereum.selectedAddress ) if( window.ethereum && window.ethereum.selectedAddress ) return setAddress( window.ethereum.selectedAddress )
// if checked five times and interval still running, slow it down
if( timesChecked > 5 && !!interval ) setInterval( 5000 )
}, interval ) }, interval )
@ -46,16 +51,21 @@ export function useAddress() {
if( window.ethereum && window.ethereum.selectedAddress ) { if( window.ethereum && window.ethereum.selectedAddress ) {
setAddress( window.ethereum.selectedAddress ) setAddress( window.ethereum.selectedAddress )
setInterval( null ) setInterval( null )
} else {
setInterval( 5000 )
} }
}, [] ) }, [] )
// Create listener to accounts change // Create listener to accounts change
useEffect( f => setListenerAndReturnUnlistener( window.ethereum, 'accountsChanged', addresses => { useEffect( f => setListenerAndReturnUnlistener( window.ethereum, 'accountsChanged', addresses => {
log( 'Addresses changed to ', addresses ) log( 'Addresses changed to ', addresses )
setAddress( addresses[0] ) const [ newAddress ] = addresses
setInterval( 5000 )
// No new address? Change nothing
if( !newAddress ) return
// New address? Set it to state and stop interval
setAddress( newAddress )
setInterval( null )
} ), [ ] ) } ), [ ] )

2268
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,7 @@
"dependencies": { "dependencies": {
"@openzeppelin/contracts": "^4.3.2", "@openzeppelin/contracts": "^4.3.2",
"@truffle/hdwallet-provider": "^1.5.1", "@truffle/hdwallet-provider": "^1.5.1",
"dotenv": "^10.0.0" "dotenv": "^10.0.0",
"truffle-ledger-provider": "^1.0.3"
} }
} }

View File

@ -20,7 +20,9 @@
require('dotenv').config() require('dotenv').config()
const HDWalletProvider = require('@truffle/hdwallet-provider'); // const HDWalletProvider = require('@truffle/hdwallet-provider');
const LedgerWalletProvider = require('truffle-ledger-provider');
const ledgerOptions = {}
// Copied from https://github.com/ProjectOpenSea/opensea-creatures // Copied from https://github.com/ProjectOpenSea/opensea-creatures
const MNEMONIC = process.env.MNEMONIC; const MNEMONIC = process.env.MNEMONIC;
@ -69,7 +71,8 @@ module.exports = {
}, },
rinkeby: { rinkeby: {
provider: function () { provider: function () {
return new HDWalletProvider(MNEMONIC, rinkebyNodeUrl); // return new HDWalletProvider(MNEMONIC, rinkebyNodeUrl);
return new LedgerWalletProvider( ledgerOptions, rinkebyNodeUrl );
}, },
gas: 5000000, gas: 5000000,
network_id: 4, network_id: 4,
@ -77,7 +80,8 @@ module.exports = {
live: { live: {
network_id: 1, network_id: 1,
provider: function () { provider: function () {
return new HDWalletProvider(MNEMONIC, mainnetNodeUrl); // return new HDWalletProvider(MNEMONIC, mainnetNodeUrl);
return new LedgerWalletProvider( ledgerOptions, rinkebyNodeUrl );
}, },
gas: 5000000, gas: 5000000,
gasPrice: 5000000000, gasPrice: 5000000000,