above two errors show the detail.
/* create-item.js */
import { useState } from 'react'
import { ethers } from 'ethers'
import { create as ipfsHttpClient } from 'ipfs-http-client'
import { useRouter } from 'next/router'
import Web3Modal from 'web3modal'
const client = ipfsHttpClient('https://ipfs.infura.io:5001/api/v0')
import {
nftaddress, nftmarketaddress
} from '../config'
import NFT from '../artifacts/contracts/NFT.sol/NFT.json'
import Market from '../artifacts/contracts/NFTMarket.sol/NFTMarket.json'
export default function CreateItem () {
const [fileUrl, setFileUrl] = useState(null)
const [formInput, updateFormInput] = useState({ price: '', name: '', description: '' })
const router = useRouter()
async function onChange(e) {
const file = e.target.files[0]
try {
const added = await client.add(
file,
{
progress: (prog) => console.log('received: ${prog}')
}
)
const url = 'https://ipfs.infura.io/ipfs/${added.path}'
setFileUrl(url)
} catch (e) {
console.log(e)
}
}
async function createItem() {
const { name, description, price } = formInput
if (!name || !description || !price || !fileUrl) return
const data = JSON.stringify({
name, description, image: fileUrl
})
try {
const added = await client.add(date)
const url = 'https://ipfs.infura.io/ipfs/${added.path}'
/* */
createSale(url)
} catch (error) {
console.log('Error uploading file: ', error)
}
}
async function createSale() {
const Web3Modal = new Web3Modal()
const connection = await web3modal.connect()
const provider = new ethers.providers.Web3Provider(connection)
const signer = provider.getSigner()
let contract = new ethers.Contract(nftaddress, NFT.abi, signer)
let transaction = await contract.createToken(url)
let tx = await transaction.wait()
let event = tx.events[0]
let value = event.args[2]
let tokenId = value.toNumber()
const price = ethers.utils.parseUnits(formInput.price, 'ether')
contract = new ethers.Contract(nftmarketaddress, Market.abi, signer)
let listingPrice = await contract.getListingPrice()
listingPrice = listingPrice.toString()
transaction = await contract.createMarketItem(
nftaddress, tokenId, price, { value: listingPrice }
)
await transaction.wait()
router.push('/')
}
return (
<div className="flex justify-center">
<div className="w-1/2 flex flex-col pb-12">
<input
placeholder="Asset Name"
className="mt-8 border rounded p-4"
onChange={e => updateFormInput({ ...formInput, name: e.target.value })}
/>
<textarea
placeholder="Asset Description"
className="mt-2 border rounded p-4"
onChange={e => updateFormInput({ ...formInput, description: e.target.value })}
/>
<input
placeholder="Asset Price in Matic"
className="mt-2 border rounded p-4"
onChange={e => updateFormInput({ ...formInput, price: e.target.value })}
/>
<input
type="file"
name="Asset"
className='my-4'
onChange={onChange}
/>
{
fileUrl && (
<img className="rounded mt-4" width="350" src={fileUrl} />
)
}
<button
onClick={createItem}
className="font-bold mt-4 bg-pink-500 text-white rounded p-4 shadow-lg"
>
Create Digital Asset
</button>
</div>
</div>
)
}
I gusss my infura is wrong with the setup.
issue: Failed to load resource: the server responded with a status of 401 (Unauthorized)
I tried to setup projectID and the secret key from infura, but it did not work.
expect:
- it seems they are already on v3 - I should move this
- the error (and the docs) suggests that I am using GET - change to POST
reference: https://www.youtube.com/watch?v=GKJBEEXUha0
However, I lost how I setup that. Could anybody suggest any idea?
You're missing the project id that infura.io requires the first screenshot returns that.
Following the sample request provided by infura.io, an Authorization header is required when a request sent, you might need to re-implement your ipfsHttpClient with the following code.
Also, there's a bug reported in older ipfs-http-client that can't pass the Authorization header properly but has been fixed in v44.0.1, make sure you're using the latest version of this package as well.
For the second screenshot,
/api/v0/add
is a POST method that is defined by infura.io, paste the URL into your browser result to trigger a GET method