Ok thanks, Iâm fairly new to the whole web3 development space, since all the data is just available in hex form, how do you parse it and is the token type included here as well? Would you be willing to share the code snippet?
For anyone also interested in this, the above tips are gold! I managed to get a version running, but wouldnât call it production ready. One thing I noticed is that the described log order for indexing does not always apply. For example, I tried to use the same logic as above, which seems to be applicable for Uniswap clones on a sushi swap (I know also a clone but seems to give different logs / order) transaction. There it didnât work as intended. I try to work around it by using the transferTopicHash as an identifier for the token transfers of the swap. Then just map the logs to transactions and parse the whole thing.
E.g. in Vue3 (see ref() function and addressing of variables with â.valueâ)
You can chain a lot of these, but I wanted to keep it step wise and understandable here. Thanks again for the tips from @Cryptokid above, they send me on a good track.
const transaction = ref()
const transferTopicHash = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";
async function getTransactionFromHash(hash) {
const options = {
chain: "ropsten",
transaction_hash: hash
};
let trxn = await Moralis.Web3API.native.getTransaction(options);
transaction.value = trxn;
// TODO (sanity checks)
// decode token addresses and values from log sequence
let transferLogs = transaction.value['logs'].filter(log => {return log.topic0 === transferTopicHash});
let fromTransfer = transferLogs.find(log => {return "0x"+log.topic2.slice(2,).replace(/\b0+/g, "") !== currentUser.attributes.ethAddress});
let toTransfer = transferLogs.find(log => {return "0x"+log.topic2.slice(2,).replace(/\b0+/g, "") === currentUser.attributes.ethAddress});
let fromTokenAmount = parseInt(Number(fromTransfer['data']), 10);
const fromTokenAddress = fromTransfer['address'];
let toTokenAmount = parseInt(Number(toTransfer['data']), 10);
const toTokenAddress = toTransfer['address'];
// get token metadata
const tokensMetadata = await Moralis.Web3API.token.getTokenMetadata( { chain: "ropsten", addresses: [fromTokenAddress, toTokenAddress] } );
// assign metadata to token
const fromTokenMeta = tokensMetadata.find(token => { return token.address === fromTokenAddress} );
const toTokenMeta = tokensMetadata.find(token => { return token.address === toTokenAddress} );
// adjust amount by tokens decimals
fromTokenAmount = fromTokenAmount / Math.pow(10, fromTokenMeta.decimals);
toTokenAmount = toTokenAmount / Math.pow(10, toTokenMeta.decimals);
console.log(fromTokenAmount + " " + fromTokenMeta.symbol + " => " + toTokenAmount + " " + toTokenMeta.symbol);
}
How would you go about retrieving the transaction hash info for a custom table? Hereâs what I have so far (cloning the amazon clone project). I want to add transaction hash to the table
let result = await Moralis.transfer(options1);
//Save Transaction Details to DB
const Transaction = Moralis.Object.extend("Transaction");
const transaction = new Transaction();
transaction.set("Customer", account);
transaction.set("Delivery", delivery);
transaction.set("Product", book.name);
transaction.set("Spent", book.price);
This line may not be ok, and you also need to use .save at the end for that query to save the data
Yes i have the save.
ok, my table is named âTransactionâ. you are saying to rename the table to a different name?
Iâm saying that the syntax seems to be different in documentation for a basic query:
const query = new Moralis.Query(Monster);
3
query.equalTo(âownerNameâ, âAegonâ);
4
const results = await query.find();
5
alert(âSuccessfully retrieved " + results.length + " monsters.â);
6
// Do something with the returned Moralis.Object values
7
for (let i = 0; i < results.length; i++) {
8
const object = results[i];
9
alert(object.id + â - â + object.get(âownerNameâ));
10
Maybe something like this but query the hash? I know all the info is stored on each transaction automatically. I need to have it âcalledâ or âsetâ or âgetâ somehow aha
vs
const Monster = Moralis.Object.extend("Monster");
const query = new Moralis.Query(Monster);
that is what I noticed
would i have to query the âBscTransactionsâ table?
I donât know, your example was only adding data with .set
you can see here how to format code on forum:
import {Select, Button, Modal, Input} from 'antd'
import {ShoppingCartOutlined} from "@ant-design/icons";
import { useState } from 'react';
import { useMoralis } from 'react-moralis';
const {Option} = Select;
function Purchase({book}) {
const [isModalVisible, setIsModalVisible] = useState(false);
const [delivery, setDelivery] = useState("");
const {Moralis, Native, account, chainId} = useMoralis();
const handleOk = async () => {
//Get token price on PancakeSwap v2 BSC
const options = {
address: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",
chain: "bsc",
exchange: "PancakeSwapv2",
};
const price = await Moralis.Web3API.token.getTokenPrice(options);
const priceBNB = book.price / price.usdPrice;
// Send Matic to book store owenr address
const options1 = {
type: "native",
amount: Moralis.Units.ETH(priceBNB),
receiver: "0xf435247364F38e7f182372fbfF58E50f0A90E88F"
}
let result = await Moralis.transfer(options1);
//Save Transaction Details to DB
const Transaction = Moralis.Object.extend("Transaction");
const transaction = new Transaction();
transaction.set("Customer", account);
transaction.set("Delivery", delivery);
transaction.set("Product", book.name);
transaction.set("Spent", book.price);
transaction.save()
setIsModalVisible(false);
}
return (
<>
<span className="price"> ${book.price}</span>
<p>No Import Fees & Free Shipping Included</p>
<h1 style={{ color: "green" }}> In Stock </h1>
<h3>Quantity</h3>
<Select defaultValue={1} style={{ width: "100%" }}>
<Option value={1}>1</Option>
<Option value={2}>2</Option>
<Option value={3}>3</Option>
<Option value={4}>4</Option>
<Option value={5}>5</Option>
</Select>
{chainId === "0x38" &&
<Button
className="login"
style={{ width: "100%", marginTop: "50px" }}
onClick={()=>setIsModalVisible(true)}
>
<ShoppingCartOutlined /> Buy Now
</Button>
}
<Modal
title="Purchase Product"
visible={isModalVisible}
onOk={handleOk}
onCancel={()=>setIsModalVisible(false)}
>
<div style={{ display: "flex" }}>
<img src={book.image} alt="product" style={{ width: "200px" }}></img>
<div>
<h3>{book.name}</h3>
<h2>${book.price}</h2>
<h4>Delivery Address</h4>
<Input onChange={(value) => setDelivery(value.target.value)}></Input>
</div>
</div>
</Modal>
</>
)
}
export default Purchase
ok thanks i edited it!
try to change this line to
const transaction = new Moralis.Query(Transaction);
do you get any error?
what doesnât work?
better to create a separate forum thread with this problem
i tried to make a transaction with this change and it did not save to my custom âTransactionâ table. Ok thanks will do
this thread started with a fantastic subject / inquiry! and then it got better⌠it got a solution!! âŚso, the solution is there in the open⌠thank you all for this. Cryptokid rulesâŚ
Now, following action⌠tigerwoooods decided to leave golf and ask an offtopic about saving data into a custom table!! ⌠and even worst! i came and i posted this comment about nothing!, please close this thread⌠is declining.
Also, thanks for that solution. It was exaclty what i was looking for!