Hi, Iâm getting getItems and getUserItems errors with the clone rarible repo. I am currently using the <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/web3.min.js"></script> <script src="https://unpkg.com/[email protected]/dist/moralis.js"></script>
library and SDK main.js file is `serverUrl = âhttps://j8wrzs2mjz2r.usemoralis.com:2053/serverâ
appId = âDI8laz6e0ls2psrkcMCkNQhjLV3BC98IUWX4ZMRlâ
Moralis.start({ serverUrl, appId});
const TOKEN_CONTRACT_ADDRESS = â0x41B23c17053a67AAB87C458cf7A8F588E48DEF6Eâ;
const MARKETPLACE_CONTRACT_ADDRESS = â0x2d7Fc09Cb3D7d39A340Ee89054493f46b8B932C6â;
init = async () => {
hideElement(userItemsSection);
window.web3 = await Moralis.enableWeb3();
const web3 = new Web3(Moralis.provider);
window.tokenContract = new web3.eth.Contract(tokenContractAbi, TOKEN_CONTRACT_ADDRESS);
window.marketplaceContract = new web3.eth.Contract(marketplaceContractAbi, MARKETPLACE_CONTRACT_ADDRESS);
initUser();
loadItems();
const soldItemsQuery = new Moralis.Query('SoldItems');
const soldItemsSubscription = await soldItemsQuery.subscribe();
soldItemsSubscription.on("create", onItemSold);
const itemsAddedQuery = new Moralis.Query('ItemsForSale');
const itemsAddedSubscription = await itemsAddedQuery.subscribe();
itemsAddedSubscription.on("create", onItemAdded);
}
onItemSold = async (item) => {
const listing = document.getElementById(item-${item.attributes.uid}
);
if (listing){
listing.parentNode.removeChild(listing);
}
user = await Moralis.User.current();
if (user){
const params = {uid: `${item.attributes.uid}`};
const soldItem = await Moralis.Cloud.run('getItem', params);
if (soldItem){
if (user.get('accounts').includes(item.attributes.buyer)){
getAndRenderItemData(soldItem, renderUserItem);
}
const userItemListing = document.getElementById(`user-item-${item.tokenObjectId}`);
if (userItemListing) userItemListing.parentNode.removeChild(userItemListing);
}
}
}
onItemAdded = async (item) => {
const params = {uid: ${item.attributes.uid}
};
const addedItem = await Moralis.Cloud.run(âgetItemâ, params);
if (addedItem){
user = await Moralis.User.current();
if (user){
if (user.get(âaccountsâ).includes(addedItem.ownerOf)){
const userItemListing = document.getElementById(user-item-${item.tokenObjectId}
);
if (userItemListing) userItemListing.parentNode.removeChild(userItemListing);
getAndRenderItemData(addedItem, renderUserItem);
return;
}
}
getAndRenderItemData(addedItem, renderItem);
}
}
initUser = async () => {
if (await Moralis.User.current()){
hideElement(userConnectButton);
showElement(userProfileButton);
showElement(openCreateItemButton);
showElement(openUserItemsButton);
loadUserItems();
}else{
//window.location.pathname = â/transferNftâ;
showElement(userConnectButton);
hideElement(userProfileButton);
hideElement(openCreateItemButton);
hideElement(openUserItemsButton);
}
}
login = async () => {
try {
await Moralis.Web3.authenticate();
initUser();
} catch (error) {
alert(error)
}
}
logout = async () => {
await Moralis.User.logOut();
hideElement(userInfo);
initUser();
}
openUserInfo = async () => {
user = await Moralis.User.current();
if (user){
const email = user.get(âemailâ);
if(email){
userEmailField.value = email;
}else{
userEmailField.value = ââ;
}
userUsernameField.value = user.get('username');
const userAvatar = user.get('avatar');
if(userAvatar){
userAvatarImg.src = userAvatar.url();
showElement(userAvatarImg);
}else{
hideElement(userAvatarImg);
}
$('#userInfo').modal('show');
}else{
login();
}
}
saveUserInfo = async () => {
user.set(âemailâ, userEmailField.value);
user.set(âusernameâ, userUsernameField.value);
if (userAvatarFile.files.length > 0) {
const avatar = new Moralis.File("avatar1.jpg", userAvatarFile.files[0]);
user.set('avatar', avatar);
}
await user.save();
alert("User info saved successfully!");
openUserInfo();
}
createItem = async () => {
if (createItemFile.files.length == 0){
alert("Please select a file!");
return;
} else if (createItemNameField.value.length == 0){
alert("Please give the item a name!");
return;
}
const nftFile = new Moralis.File("nftFile.jpg",createItemFile.files[0]);
await nftFile.saveIPFS();
const nftFilePath = nftFile.ipfs();
const metadata = {
name: createItemNameField.value,
description: createItemDescriptionField.value,
image: nftFilePath,
};
const nftFileMetadataFile = new Moralis.File("metadata.json", {base64 : btoa(JSON.stringify(metadata))});
await nftFileMetadataFile.saveIPFS();
const nftFileMetadataFilePath = nftFileMetadataFile.ipfs();
console.log(nftFileMetadataFilePath);
const nftId = await mintNft(nftFileMetadataFilePath);
user = await Moralis.User.current();
const userAddress = user.get('ethAddress');
switch(createItemStatusField.value){
case "0":
return;
case "1":
await ensureMarketplaceIsApproved(nftId, TOKEN_CONTRACT_ADDRESS);
await marketplaceContract.methods.addItemToMarket(nftId, TOKEN_CONTRACT_ADDRESS, createItemPriceField.value).send({from: userAddress });
break;
case "2":
alert("Not yet supported!");
return;
}
}
mintNft = async (metadataUrl) => {
const receipt = await tokenContract.methods.createItem(metadataUrl).send({from: ethereum.selectedAddress});
console.log(receipt);
return receipt.events.Transfer.returnValues.tokenId;
}
openUserItems = async () => {
user = await Moralis.User.current();
if (user){
$(â#userItemsâ).modal(âshowâ);
}else{
login();
}
}
loadUserItems = async () => {
const ownedItems = await Moralis.Cloud.run(âgetUserItemsâ);
ownedItems.forEach(item => {
const userItemListing = document.getElementById(user-item-${item.tokenObjectId}
);
if (userItemListing) return;
getAndRenderItemData(item, renderUserItem);
});
}
loadItems = async () => {
const items = await Moralis.Cloud.run(âgetItemsâ);
user = await Moralis.User.current();
items.forEach(item => {
if (user){
if (user.attributes.accounts.includes(item.ownerOf)){
const userItemListing = document.getElementById(user-item-${item.tokenObjectId}
);
if (userItemListing) userItemListing.parentNode.removeChild(userItemListing);
getAndRenderItemData(item, renderUserItem);
return;
}
}
getAndRenderItemData(item, renderItem);
});
}
initTemplate = (id) => {
const template = document.getElementById(id);
template.id = ââ;
template.parentNode.removeChild(template);
return template;
}
renderUserItem = async (item) => {
const userItemListing = document.getElementById(user-item-${item.tokenObjectId}
);
if (userItemListing) return;
const userItem = userItemTemplate.cloneNode(true);
userItem.getElementsByTagName("img")[0].src = item.image;
userItem.getElementsByTagName("img")[0].alt = item.name;
userItem.getElementsByTagName("h5")[0].innerText = item.name;
userItem.getElementsByTagName("p")[0].innerText = item.description;
userItem.getElementsByTagName("input")[0].value = item.askingPrice ?? 1;
userItem.getElementsByTagName("input")[0].disabled = item.askingPrice > 0;
userItem.getElementsByTagName("button")[0].disabled = item.askingPrice > 0;
userItem.getElementsByTagName("button")[0].onclick = async () => {
user = await Moralis.User.current();
if (!user){
login();
return;
}
await ensureMarketplaceIsApproved(item.tokenId, item.tokenAddress);
await marketplaceContract.methods.addItemToMarket(item.tokenId, item.tokenAddress, userItem.getElementsByTagName("input")[0].value).send({from: user.get('ethAddress') });
};
userItem.id = `user-item-${item.tokenObjectId}`
userItems.appendChild(userItem);
}
renderItem = (item) => {
const itemForSale = marketplaceItemTemplate.cloneNode(true);
if (item.sellerAvatar){
itemForSale.getElementsByTagName(âimgâ)[0].src = item.sellerAvatar.url();
itemForSale.getElementsByTagName(âimgâ)[0].alt = item.sellerUsername;
}
itemForSale.getElementsByTagName("img")[1].src = item.image;
itemForSale.getElementsByTagName("img")[1].alt = item.name;
itemForSale.getElementsByTagName("h5")[0].innerText = item.name;
itemForSale.getElementsByTagName("p")[0].innerText = item.description;
itemForSale.getElementsByTagName("button")[0].innerText = `Buy for ${item.askingPrice}`;
itemForSale.getElementsByTagName("button")[0].onclick = () => buyItem(item);
itemForSale.id = `item-${item.uid}`;
itemsForSale.appendChild(itemForSale);
}
getAndRenderItemData = (item, renderFunction) => {
fetch(item.tokenUri)
.then(response => response.json())
.then(data => {
item.name = data.name;
item.description = data.description;
item.image = data.image;
renderFunction(item);
})
}
ensureMarketplaceIsApproved = async (tokenId, tokenAddress) => {
user = await Moralis.User.current();
const userAddress = user.get(âethAddressâ);
const contract = new web3.eth.Contract(tokenContractAbi, tokenAddress);
const approvedAddress = await contract.methods.getApproved(tokenId).call({from: userAddress});
if (approvedAddress != MARKETPLACE_CONTRACT_ADDRESS){
await contract.methods.approve(MARKETPLACE_CONTRACT_ADDRESS,tokenId).send({from: userAddress});
}
}
buyItem = async (item) => {
user = await Moralis.User.current();
if (!user){
login();
return;
}
await marketplaceContract.methods.buyItem(item.uid).send({from: user.get(âethAddressâ), value: item.askingPrice});
}
hideElement = (element) => element.style.display = ânoneâ;
showElement = (element) => element.style.display = âblockâ;
// Navbar
const userConnectButton = document.getElementById(âbtnConnectâ);
userConnectButton.onclick = login;
const userProfileButton = document.getElementById(âbtnUserInfoâ);
userProfileButton.onclick = openUserInfo;
const openCreateItemButton = document.getElementById(âbtnOpenCreateItemâ);
openCreateItemButton.onclick = () => $(â#createItemâ).modal(âshowâ);
// User profile
const userInfo = document.getElementById(âuserInfoâ);
const userUsernameField = document.getElementById(âtxtUsernameâ);
const userEmailField = document.getElementById(âtxtEmailâ);
const userAvatarImg = document.getElementById(âimgAvatarâ);
const userAvatarFile = document.getElementById(âfileAvatarâ);
document.getElementById(âbtnCloseUserInfoâ).onclick = () => hideElement(userInfo);
document.getElementById(âbtnLogoutâ).onclick = logout;
document.getElementById(âbtnSaveUserInfoâ).onclick = saveUserInfo;
// Item creation
const createItemForm = document.getElementById(âcreateItemâ);
const createItemNameField = document.getElementById(âtxtCreateItemNameâ);
const createItemDescriptionField = document.getElementById(âtxtCreateItemDescriptionâ);
const createItemPriceField = document.getElementById(ânumCreateItemPriceâ);
const createItemStatusField = document.getElementById(âselectCreateItemStatusâ);
const createItemFile = document.getElementById(âfileCreateItemFileâ);
document.getElementById(âbtnCloseCreateItemâ).onclick = () => hideElement(createItemForm);
document.getElementById(âbtnCreateItemâ).onclick = createItem;
// User items
const userItemsSection = document.getElementById(âuserItemsâ);
const userItems = document.getElementById(âuserItemsListâ);
document.getElementById(âbtnCloseUserItemsâ).onclick = () => hideElement(userItemsSection);
const openUserItemsButton = document.getElementById(âbtnMyItemsâ);
openUserItemsButton.onclick = openUserItems;
const userItemTemplate = initTemplate(âitemTemplateâ);
const marketplaceItemTemplate = initTemplate(âmarketplaceItemTemplateâ);
// Items for sale
const itemsForSale = document.getElementById(âitemsForSaleâ);
init();just updated the
serverUrl = âhttps://j8wrzs2mjz2r.usemoralis.com:2053/serverâ
appId = âDI8laz6e0ls2psrkcMCkNQhjLV3BC98IUWX4ZMRlâ
Moralis.start({ serverUrl, appId});and
window.web3 = await Moralis.enableWeb3();
const web3 = new Web3(Moralis.provider);`
However, Iâm unable to find any problems on my side I just see errors with the SDK, `Uncaught (in promise) Error: Invalid function: âgetItemsâ
_construct https://unpkg.com/[email protected]/dist/moralis.js:29705
Wrapper https://unpkg.com/[email protected]/dist/moralis.js:30055
_createSuper https://unpkg.com/[email protected]/dist/moralis.js:12208
ParseError https://unpkg.com/[email protected]/dist/moralis.js:12259
handleError https://unpkg.com/[email protected]/dist/moralis.js:25849
promise callbackrequest https://unpkg.com/[email protected]/dist/moralis.js:25839
run https://unpkg.com/[email protected]/dist/moralis.js:457
run https://unpkg.com/[email protected]/dist/moralis.js:383
loadItems http://127.0.0.1:8887/main.js:225
init http://127.0.0.1:8887/main.js:32
async http://127.0.0.1:8887/main.js:377
moralis.js:29705:21
â`
Not else what else can be done, I feel stuck with this problem. I would appreciate any help, thanks.