From ebb63e6960129329b95f61eb7a6a84a6dd0bf2c6 Mon Sep 17 00:00:00 2001 From: Mentor Palokaj Date: Thu, 9 Dec 2021 15:55:21 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Enable=20beta=20pluripotent=20chang?= =?UTF-8?q?ing=20room?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions/integrations/changingroom.js | 41 ++++++++++-------- functions/nft-media/changing-room.js | 5 +-- minter/src/components/atoms/Container.js | 2 +- minter/src/components/organisms/Outfits.js | 49 +++++++++++++++++++++- 4 files changed, 74 insertions(+), 23 deletions(-) diff --git a/functions/integrations/changingroom.js b/functions/integrations/changingroom.js index 0560e7e..cb3ae27 100644 --- a/functions/integrations/changingroom.js +++ b/functions/integrations/changingroom.js @@ -25,9 +25,8 @@ exports.generateNewOutfit = async function( req, res ) { try { - // Disable changing room for now - const potentialLaunchDate = new Date( `2021-12-10` ) - if( new Date() < potentialLaunchDate ) throw new Error( `Changing room is not yet live, sorry. Stay tuned on Discord.` ) + // Internal beta + if( id != 1 ) return res.json( { error: `Sorry the changing room is in private beta for now <3` } ) // Get request data const { message, signature, signatory } = req.body @@ -79,29 +78,37 @@ exports.generateMultipleNewOutfits = async function( req, res ) { // Protect against malformed input if( !address.match( /0x.{40}/ ) ) return res.json( { error: `Malformed request` } ) - // ⚠️ WIP - const network = 'rinkeby' - if( !process.env.NODE_ENV == 'development' ) return res.json( { error: `This endpoint is not live yet. While I appreciate your enthusiasm please don't touch this one yet :)` } ) + // Lowercase the address + address = address.toLowerCase() + + // Internal beta + if( !address.includes( '0xe3ae14' ) && !address.includes( '0x7dbf68' ) ) return res.json( { error: `Sorry this endpoint is in private beta for now <3` } ) try { - // // Get request data - // const { message, signature, signatory } = req.body - // if( !message || !signatory || !signature ) throw new Error( `Malformed request` ) + // Get request data + const { message, signature, signatory } = req.body + if( !message || !signatory || !signature ) throw new Error( `Malformed request` ) - // // Decode message - // const confirmedSignatory = web3.eth.accounts.recover( message, signature ) - // if( signatory.toLowerCase() !== confirmedSignatory.toLowerCase() ) throw new Error( `Bad signature` ) + // Decode message + const confirmedSignatory = web3.eth.accounts.recover( message, signature ) + if( signatory.toLowerCase() !== confirmedSignatory.toLowerCase() ) throw new Error( `Bad signature` ) - // // Validate message - // const messageObject = JSON.parse( message ) - // let { signer, action, chainId } = messageObject - // const network = chainId == '0x1' ? 'mainnet' : 'rinkeby' - // if( signer.toLowerCase() !== confirmedSignatory.toLowerCase() || action != 'generateMultipleNewOutfits' || !network ) throw new Error( `Invalid setPrimaryOutfit message with ${ signer }, ${confirmedSignatory}, ${action}, ${chainId}, ${network}` ) + // Validate message + const messageObject = JSON.parse( message ) + let { signer, action, chainId } = messageObject + const network = chainId == '0x1' ? 'mainnet' : 'rinkeby' + if( signer.toLowerCase() !== confirmedSignatory.toLowerCase() || action != 'generateMultipleNewOutfits' || !network ) throw new Error( `Invalid setPrimaryOutfit message with ${ signer }, ${confirmedSignatory}, ${action}, ${chainId}, ${network}` ) // Check that the signer is the owner of the token const outfits = await generateNewOutfitsByAddress( address, network ) + await db.collection( 'meta' ).doc( address ).set( { + last_changing_room: Date.now(), + last_changing_room_errors: outfits.error.map( ( { id } ) => id ), + last_changing_room_successes: outfits.success.map( ( { id } ) => id ) + }, { merge: true } ) + return res.json( outfits ) diff --git a/functions/nft-media/changing-room.js b/functions/nft-media/changing-room.js index e6767de..84b6f63 100644 --- a/functions/nft-media/changing-room.js +++ b/functions/nft-media/changing-room.js @@ -114,10 +114,7 @@ async function generateNewOutfitsByAddress( address, network='mainnet' ) { const ids = await getTokenIdsOfAddress( address, network ) const queue = ids.map( id => function() { - return generateNewOutfitFromId( id, network ).then( outfit => ( { id: id, src: outfit } ) ).catch( e => { - console.log( e ) - return ( { id: id, error: e.message } ) - } ) + return generateNewOutfitFromId( id, network ).then( outfit => ( { id: id, src: outfit } ) ).catch( e => ( { id: id, error: e.message } ) ) } ) const outfits = await Throttle.all( queue, { maxInProgress: 2, diff --git a/minter/src/components/atoms/Container.js b/minter/src/components/atoms/Container.js index ab45555..0019ab9 100644 --- a/minter/src/components/atoms/Container.js +++ b/minter/src/components/atoms/Container.js @@ -25,7 +25,7 @@ const Wrapper = styled.div` justify-content: ${ ( { justify='center' } ) => justify }; min-height: 100vh; width: 100%; - padding: ${ ( { gutter=true } ) => gutter ? '0 max( 1rem, calc( 25vw - 4rem ) )' : 'none' }; + padding: ${ ( { gutter=true } ) => gutter ? '3rem max( 1rem, calc( 25vw - 4rem ) )' : 'none' }; // margin-bottom: 10rem; box-sizing: border-box; & * { diff --git a/minter/src/components/organisms/Outfits.js b/minter/src/components/organisms/Outfits.js index fba40db..8472570 100644 --- a/minter/src/components/organisms/Outfits.js +++ b/minter/src/components/organisms/Outfits.js @@ -6,7 +6,7 @@ import { useParams, useNavigate } from 'react-router' import Container from '../atoms/Container' import Section from '../atoms/Section' -import { H1, H2, Text } from '../atoms/Text' +import { H1, H2, Text, Sidenote } from '../atoms/Text' import Button from '../atoms/Button' import Avatar from '../molecules/Avatar' @@ -119,6 +119,52 @@ export default function Verifier() { } + async function generateByAddress( ) { + + try { + + log( `Generating new outfit for address ${ address }` ) + setLoading( `Generating new outfits for ${ address }` ) + alert( 'You will be prompted to sign a message, this is NOT a transaction' ) + + const signature = await sign( JSON.stringify( { + signer: address.toLowerCase(), + action: 'generateMultipleNewOutfits', + chainId, + } ), address ) + + log( 'Making request with ', signature ) + + setLoading( 'Generating new outfits, this can take a few minutes' ) + + const { error, success } = await callApi( `/rocketeers/${ address }`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify( signature ) + } ) + log( `Errored: `, error ) + log( `Succeeded: `, success ) + + if( typeof error == 'string' ) throw new Error( error ) + + + alert( `Success! ${ success.length } outfits generated, ${ error.length } failed.` ) + window?.location.reload() + + + } catch( e ) { + + log( e ) + alert( e.message ) + + } finally { + + setLoading( false ) + + } + + } + // /////////////////////////////// // Lifecycle // /////////////////////////////// @@ -178,6 +224,7 @@ export default function Verifier() { Rocketeers owned by: { address }. + _