Simulates a transaction and returns a list of asset changes.
Try it out - alchemy_simulateAssetChanges.
How does it work?
- You give us a transaction (unsigned transaction object) 📦
- We simulate your transaction on our blazing fast infra ⚡
- We return a complete list of asset changes (including tokens and NFTs) 💸
What do you get back?
We currently return the following info:
- gas used
- change type (approval, transfer)
- asset type (native, erc20, erc721, erc1155, special nft)
- sender / destination
- amount
- additional metadata (logo, token id, contract address)
Examples
Chain support
The examples below are for Eth Mainnet and Polygon Mainnet.
Simulation also works on Arbitrum and testnets - more examples coming soon!
Ethereum
ETH - Transfer
0xbe0eb53f46cd790cd13851d5eff43d12404d33e8
sending 1 ETH to 0xc02aaa39b223fe8d050e5c4f27ead9083c756cc2
.
To send a normal transfer, remove the data
field from the transaction object in the request.
We will add support for data: " "
and data: "0x"
soon.
{
"from": "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
"to": "0xc02aaa39b223fe8d050e5c4f27ead9083c756cc2",
"value": "0xDE0B6B3A7640000"
}
curl --location --request POST 'https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "alchemy_simulateAssetChanges",
"id": 1,
"params": [
{
"from": "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
"to": "0xc02aaa39b223fe8d050e5c4f27ead9083c756cc2",
"value": "0xDE0B6B3A7640000"
}
]
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"changes": [
{
"assetType": "NATIVE",
"changeType": "TRANSFER",
"from": "0xbe0eb53f46cd790cd13851d5eff43d12404d33e8",
"to": "0xc02aaa39b223fe8d050e5c4f27ead9083c756cc2",
"rawAmount": "1000000000000000000",
"contractAddress": null,
"tokenId": null,
"decimals": 18,
"symbol": "ETH",
"name": "Ethereum",
"logo": "https://static.alchemyapi.io/images/network-assets/eth.png",
"amount": "1"
}
],
"gasUsed": "0x0",
"error": null
}
}
// npm install alchemy-sdk
import { Network, Alchemy } from "alchemy-sdk";
const alchemy = new Alchemy({
apiKey: "demo", // Replace with your Alchemy API Key.
network: Network.ETH_MAINNET,
});
(async => {
const transaction = {
from: "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
to: "0xc02aaa39b223fe8d050e5c4f27ead9083c756cc2",
value: "0xDE0B6B3A7640000"
};
const { changes, error } = await alchemy.transact.simulateAssetChanges(transaction);
console.log('Changes', changes);
console.log('Error', error);
})();
ERC20 - Transfer
vitalik.eth (0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
) sending 1 USDC to demo.eth (0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
).
{
"from": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"value": "0x0",
"data": "0xa9059cbb000000000000000000000000fc43f5f9dd45258b3aff31bdbe6561d97e8b71de00000000000000000000000000000000000000000000000000000000000f4240"
}
curl --location --request POST 'https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "alchemy_simulateAssetChanges",
"id": 1,
"params": [
{
"from": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"value": "0x0",
"data": "0xa9059cbb000000000000000000000000fc43f5f9dd45258b3aff31bdbe6561d97e8b71de00000000000000000000000000000000000000000000000000000000000f4240"
}
]
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"changes": [
{
"assetType": "ERC20",
"changeType": "TRANSFER",
"from": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
"to": "0xfc43f5f9dd45258b3aff31bdbe6561d97e8b71de",
"rawAmount": "1000000",
"contractAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"tokenId": null,
"decimals": 6,
"symbol": "USDC",
"name": "USD Coin",
"logo": "https://static.alchemyapi.io/images/assets/3408.png",
"amount": "1"
}
],
"gasUsed": "0x6925",
"error": null
}
}
// npm install alchemy-sdk
import { Network, Alchemy } from "alchemy-sdk";
const alchemy = new Alchemy({
apiKey: "demo", // Replace with your Alchemy API Key.
network: Network.ETH_MAINNET,
});
(async => {
const transaction = {
from: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
to: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
value: "0x0",
data: "0xa9059cbb000000000000000000000000fc43f5f9dd45258b3aff31bdbe6561d97e8b71de00000000000000000000000000000000000000000000000000000000000f4240"
};
const { changes, error } = await alchemy.transact.simulateAssetChanges(transaction);
console.log('Changes', changes);
console.log('Error', error);
})();
WETH - Wrap
0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8
depositing 1 ETH and getting 1 WETH back.
{
"from": "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"data": "0xd0e30db0",
"value": "0xDE0B6B3A7640000"
}
curl --location --request POST 'https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "alchemy_simulateAssetChanges",
"id": 1,
"params": [
{
"from": "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"data": "0xd0e30db0",
"value": "0xDE0B6B3A7640000"
}
]
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"changes": [
{
"assetType": "NATIVE",
"changeType": "TRANSFER",
"from": "0xbe0eb53f46cd790cd13851d5eff43d12404d33e8",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"rawAmount": "1000000000000000000",
"contractAddress": null,
"tokenId": null,
"decimals": 18,
"symbol": "ETH",
"name": "Ethereum",
"logo": "https://static.alchemyapi.io/images/network-assets/eth.png",
"amount": "1"
},
{
"assetType": "ERC20",
"changeType": "TRANSFER",
"from": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"to": "0xbe0eb53f46cd790cd13851d5eff43d12404d33e8",
"rawAmount": "1000000000000000000",
"contractAddress": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"tokenId": null,
"decimals": 18,
"symbol": "WETH",
"name": "WETH",
"logo": "https://static.alchemyapi.io/images/assets/2396.png",
"amount": "1"
}
],
"gasUsed": "0x5da6",
"error": null
}
}
// npm install alchemy-sdk
import { Network, Alchemy } from "alchemy-sdk";
const alchemy = new Alchemy({
apiKey: "demo", // Replace with your Alchemy API Key.
network: Network.ETH_MAINNET,
});
(async => {
const transaction = {
from: "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
to: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
data: "0xd0e30db0",
value: "0xDE0B6B3A7640000"
};
const { changes, error } = await alchemy.transact.simulateAssetChanges(transaction);
console.log('Changes', changes);
console.log('Error', error);
})();
WETH - Unwrap
0x2e95E1cD077f29733C65D885Ce7AFE278d0726A6
withdrawing 1 ETH (1 WETH sent, 1 ETH returned).
{
"from": "0x2e95E1cD077f29733C65D885Ce7AFE278d0726A6",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"value": "0x0",
"data": "0x2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3a7640000"
}
curl --location --request POST 'https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "alchemy_simulateAssetChanges",
"id": 1,
"params": [
{
"from": "0x2e95E1cD077f29733C65D885Ce7AFE278d0726A6",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"value": "0x0",
"data": "0x2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3a7640000"
}
]
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"changes": [
{
"assetType": "NATIVE",
"changeType": "TRANSFER",
"from": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"to": "0x2e95e1cd077f29733c65d885ce7afe278d0726a6",
"rawAmount": "1000000000000000000",
"contractAddress": null,
"tokenId": null,
"decimals": 18,
"symbol": "ETH",
"name": "Ethereum",
"logo": "https://static.alchemyapi.io/images/network-assets/eth.png",
"amount": "1"
},
{
"assetType": "ERC20",
"changeType": "TRANSFER",
"from": "0x2e95e1cd077f29733c65d885ce7afe278d0726a6",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"rawAmount": "1000000000000000000",
"contractAddress": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"tokenId": null,
"decimals": 18,
"symbol": "WETH",
"name": "WETH",
"logo": "https://static.alchemyapi.io/images/assets/2396.png",
"amount": "1"
}
],
"gasUsed": "0x3674",
"error": null
}
}
// npm install alchemy-sdk
import { Network, Alchemy } from "alchemy-sdk";
const alchemy = new Alchemy({
apiKey: "demo", // Replace with your Alchemy API Key.
network: Network.ETH_MAINNET,
});
(async => {
const transaction = {
from: "0x2e95E1cD077f29733C65D885Ce7AFE278d0726A6",
to: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
value: "0x0",
data: "0x2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3a7640000"
};
const { changes, error } = await alchemy.transact.simulateAssetChanges(transaction);
console.log('Changes', changes);
console.log('Error', error);
})();
Polygon
MATIC - Transfer
0xe7804c37c13166ff0b37f5ae0bb07a3aebb6e245
sending 5 MATIC to 0x0d500b1d8e8ef31e21c99e1db9a6444d3adf1270
.
To send a normal transfer, remove the data
field from the transaction object in the request.
We will add support for data: " "
and data: "0x"
soon.
{
"from": "0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245",
"to": "0x0d500b1d8e8ef31e21c99e1db9a6444d3adf1270",
"value": "0x4563918244F40000"
}
curl --location --request POST 'https://polygon-mainnet.g.alchemy.com/v2/YOUR_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "alchemy_simulateAssetChanges",
"id": 1,
"params": [
{
"from": "0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245",
"to": "0x0d500b1d8e8ef31e21c99e1db9a6444d3adf1270",
"value": "0x4563918244F40000"
}
]
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"changes": [
{
"assetType": "NATIVE",
"changeType": "TRANSFER",
"from": "0xe7804c37c13166ff0b37f5ae0bb07a3aebb6e245",
"to": "0x0d500b1d8e8ef31e21c99e1db9a6444d3adf1270",
"rawAmount": "5000000000000000000",
"contractAddress": null,
"tokenId": null,
"decimals": 18,
"symbol": "MATIC",
"name": "MATIC",
"logo": "https://static.alchemyapi.io/images/network-assets/matic.png",
"amount": "5"
}
],
"gasUsed": "0x0",
"error": null
}
}
// npm install alchemy-sdk
import { Network, Alchemy } from "alchemy-sdk";
const alchemy = new Alchemy(settings);
const alchemy = new Alchemy({
apiKey: "demo", // Replace with your Alchemy API Key.
network: Network.MATIC_MAINNET,
});
(async => {
const transaction = {
from: "0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245",
to: "0x0d500b1d8e8ef31e21c99e1db9a6444d3adf1270",
value: "0x4563918244F40000"
};
const { changes, error } = await alchemy.transact.simulateAssetChanges(transaction);
console.log('Changes', changes);
console.log('Error', error);
})();
ERC20 - Transfer
0xf977814e90da44bfa03b6295a0616a897441acec
sending 1 USDC to 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174
.
{
"from": "0xF977814e90dA44bFA03b6295A0616a897441aceC",
"to": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
"value": "0x0",
"data": "0xa9059cbb000000000000000000000000fc43f5f9dd45258b3aff31bdbe6561d97e8b71de00000000000000000000000000000000000000000000000000000000000f4240"
}
curl --location --request POST 'https://polygon-mainnet.g.alchemy.com/v2/YOUR_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "alchemy_simulateAssetChanges",
"id": 1,
"params": [
{
"from": "0xF977814e90dA44bFA03b6295A0616a897441aceC",
"to": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
"value": "0x0",
"data": "0xa9059cbb000000000000000000000000fc43f5f9dd45258b3aff31bdbe6561d97e8b71de00000000000000000000000000000000000000000000000000000000000f4240"
}
]
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"changes": [
{
"assetType": "ERC20",
"changeType": "TRANSFER",
"from": "0xf977814e90da44bfa03b6295a0616a897441acec",
"to": "0xfc43f5f9dd45258b3aff31bdbe6561d97e8b71de",
"rawAmount": "1000000",
"contractAddress": "0x2791bca1f2de4661ed88a30c99a7a9449aa84174",
"tokenId": null,
"decimals": 6,
"symbol": "USDC",
"name": "USD Coin (PoS)",
"logo": null,
"amount": "1"
}
],
"gasUsed": "0xa3d8",
"error": null
}
}
// npm install alchemy-sdk
import { Network, Alchemy } from "alchemy-sdk";
const alchemy = new Alchemy(settings);
const alchemy = new Alchemy({
apiKey: "demo", // Replace with your Alchemy API Key.
network: Network.MATIC_MAINNET,
});
(async => {
const transaction = {
from: "0xF977814e90dA44bFA03b6295A0616a897441aceC",
to: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
value: "0x0",
data: "0xa9059cbb000000000000000000000000fc43f5f9dd45258b3aff31bdbe6561d97e8b71de00000000000000000000000000000000000000000000000000000000000f4240"
};
const { changes, error } = await alchemy.transact.simulateAssetChanges(transaction);
console.log('Changes', changes);
console.log('Error', error);
})();
WMATIC - Wrap
0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245
depositing 5 MATIC and getting 5 WMATIC back.
{
"from": "0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245",
"to": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"data": "0xd0e30db0",
"value": "0x4563918244F40000"
}
curl --location --request POST 'https://polygon-mainnet.g.alchemy.com/v2/YOUR_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "alchemy_simulateAssetChanges",
"id": 1,
"params": [
{
"from": "0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245",
"to": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"data": "0xd0e30db0",
"value": "0x4563918244F40000"
}
]
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"changes": [
{
"assetType": "NATIVE",
"changeType": "TRANSFER",
"from": "0xe7804c37c13166ff0b37f5ae0bb07a3aebb6e245",
"to": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"rawAmount": "5000000000000000000",
"contractAddress": null,
"tokenId": null,
"decimals": 18,
"symbol": "MATIC",
"name": "MATIC",
"logo": "https://static.alchemyapi.io/images/network-assets/matic.png",
"amount": "5"
},
{
"assetType": "ERC20",
"changeType": "TRANSFER",
"from": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"to": "0xe7804c37c13166ff0b37f5ae0bb07a3aebb6e245",
"rawAmount": "5000000000000000000",
"contractAddress": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"tokenId": null,
"decimals": 18,
"symbol": "WMATIC",
"name": "Wrapped Matic",
"logo": "https://static.alchemyapi.io/images/assets/8925.png",
"amount": "5"
}
],
"gasUsed": "0x1add",
"error": null
}
}
// npm install alchemy-sdk
import { Network, Alchemy } from "alchemy-sdk";
const alchemy = new Alchemy(settings);
const alchemy = new Alchemy({
apiKey: "demo", // Replace with your Alchemy API Key.
network: Network.MATIC_MAINNET,
});
(async => {
const transaction = {
from: "0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245",
to: "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
data: "0xd0e30db0",
value: "0x4563918244F40000"
};
const { changes, error } = await alchemy.transact.simulateAssetChanges(transaction);
console.log('Changes', changes);
console.log('Error', error);
})();
WMATIC - Unwrap
0xccc52f64ee0fff73ad7312825ee767ce94d4877a
withdrawing 1 MATIC (1 WMATIC sent, 1 MATIC returned).
{
"from": "0xccc52f64ee0fff73ad7312825ee767ce94d4877a",
"to": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"value": "0x0",
"data": "0x2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3a7640000"
}
curl --location --request POST 'https://polygon-mainnet.g.alchemy.com/v2/YOUR_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "alchemy_simulateAssetChanges",
"id": 1,
"params": [
{
"from": "0xccc52f64ee0fff73ad7312825ee767ce94d4877a",
"to": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"value": "0x0",
"data": "0x2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3a7640000"
}
]
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"changes": [
{
"assetType": "NATIVE",
"changeType": "TRANSFER",
"from": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"to": "0xccc52f64ee0fff73ad7312825ee767ce94d4877a",
"rawAmount": "1000000000000000000",
"contractAddress": null,
"tokenId": null,
"decimals": 18,
"symbol": "MATIC",
"name": "MATIC",
"logo": "https://static.alchemyapi.io/images/network-assets/matic.png",
"amount": "1"
},
{
"assetType": "ERC20",
"changeType": "TRANSFER",
"from": "0xccc52f64ee0fff73ad7312825ee767ce94d4877a",
"to": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"rawAmount": "1000000000000000000",
"contractAddress": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
"tokenId": null,
"decimals": 18,
"symbol": "WMATIC",
"name": "Wrapped Matic",
"logo": "https://static.alchemyapi.io/images/assets/8925.png",
"amount": "1"
}
],
"gasUsed": "0x3697",
"error": null
}
}
// npm install alchemy-sdk
import { Network, Alchemy } from "alchemy-sdk";
const alchemy = new Alchemy(settings);
const alchemy = new Alchemy({
apiKey: "demo", // Replace with your Alchemy API Key.
network: Network.MATIC_MAINNET,
});
(async => {
const transaction = {
from: "0xccc52f64ee0fff73ad7312825ee767ce94d4877a",
to: "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
value: "0x0",
data: "0x2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3a7640000"
};
const { changes, error } = await alchemy.transact.simulateAssetChanges(transaction);
console.log('Changes', changes);
console.log('Error', error);
})();
For a deep dive check out our Asset Changes - Explained guide.