Viem — это TypeScript-интерфейс для Ethereum, предоставляющий низкоуровневые stateless-примитивы для взаимодействия с Ethereum.
Вы можете взаимодействовать с Virtual Environments с помощью стандартных RPC-методов, скопировав Public RPC,
а также пользовательских методов, доступных в Node RPC, скопировав Admin RPC.
Примеры кода: использование Viem с Virtual Environments
Определите кастомную цепочку
Создайте файл tenderly.config.ts и используйте defineChain для создания объекта цепочки.
Если при создании Virtual Environment вы указали уникальный Chain ID, вам нужно создать новый объект цепочки и установить id в выбранное значение.
virtual-environments/src/tenderly.config.ts
export const vMainnet = defineChain({
id: 73571,
name: 'Virtual Ethereum Mainnet',
nativeCurrency: { name: 'vEther', symbol: 'vETH', decimals: 18 },
rpcUrls: {
default: { http: [process.env.TENDERLY_VIRTUAL_MAINNET_RPC!] },
},
blockExplorers: {
default: {
name: 'Tenderly Explorer',
url: process.env.TENDERLY_VIRTUAL_MAINNET_EXPLORER!
},
},
contracts: {
ensRegistry: {
address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
},
ensUniversalResolver: {
address: '0xE4Acdd618deED4e6d2f03b9bf62dc6118FC9A4da',
blockCreated: 16773775,
},
multicall3: {
address: '0xca11bde05977b3631167028862be2a173976ca11',
blockCreated: 14353601,
},
},
});
Определите Viem-actions для пользовательских RPC-методов
Определите Viem-actions для пользовательских RPC-методов, таких как tenderly_setBalance, tenderly_setErc20Balance и simulate.
Например, следующий файл определяет action tenderlySetBalance, который будет вызывать tenderly_setBalance.
Больше actions можно найти здесь:
Viem-actions для пользовательских RPC-методов
virtual-environments/src/viem-tenderly-actions.ts
type TSetBalanceParams = [addresses: Hex[], value: Hex];
export async function tenderlySetBalance(client: Client, params: TSetBalanceParams) {
return client.request<{
method: 'tenderly_setBalance',
Parameters: TSetBalanceParams,
ReturnType: Hex
}>({
method: 'tenderly_setBalance',
params: params,
});
}
Вызов стандартных и пользовательских RPC-методов
В этом примере вы можете увидеть, как:
- Вызвать Viem’овский
createPublicClient и передать следующие аргументы:
chain: установлен в vMainnet, определённый на предыдущем шаге
transport: либо вызов http, установленный в https RPC URL.
virtual-environments/src/viem-call-balance-top-up.ts
(async () => {
const client = createPublicClient({
chain: vMainnet,
transport: http(vMainnet.rpcUrls.default.http[0]),
});
console.log("Block Number", await client.getBlockNumber());
console.log("Chain", await client.getChainId());
const balanceTxs = await Promise.all([
tenderlySetBalance(client, [
["0x0d2026b3EE6eC71FC6746ADb6311F6d3Ba1C000B", "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"],
"0xDE0B6B3A7640000"
]),
tenderlySetErc20Balance(client, [
"0xdAC17F958D2ee523a2206206994597C13D831ec7",
"0x40BdB4497614bAe1A67061EE20AAdE3c2067AC9e",
"0xDE0B6B3A7640000"
]),
// USDT
tenderlySetErc20Balance(client, [
"0x6B175474E89094C44Da98b954EedeAC495271d0F",
"0x40BdB4497614bAe1A67061EE20AAdE3c2067AC9e",
"0xDE0B6B3A7640000"
]),
tenderlySetErc20Balance(client, [
"0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE",
"0x40BdB4497614bAe1A67061EE20AAdE3c2067AC9e",
"0xDE0B6B3A7640000"
]),
]);
console.log(
"ETH balance, DAI and ShibaInu topups",
balanceTxs.map(txHash => `${(vMainnet.blockExplorers.default.url)}/tx/${txHash}`));
})().catch(e => {
console.error(e);
process.exitCode = 1;
});
Симуляция транзакций с помощью viem
Чтобы использовать Simulation RPC методы Virtual Environment, просто выполните request для вызова tenderly_simulateTransaction:
virtual-environments/src/viem-call-simulate.ts
const client = createPublicClient({
chain: vMainnet,
transport: http(vMainnet.rpcUrls.default[0])
});
const simulation = await client.request({
method: "tenderly_simulateTransaction",
params: [
// transaction object
{
from: "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
to: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
gas: "0x0",
gasPrice: "0x0",
value: "0x0",
data: "0xa9059cbb00000000000000000000000020a5814b73ef3537c6e099a0d45c798f4bd6e1d60000000000000000000000000000000000000000000000000000000000000001",
},
// the block
"latest",
],
});
console.log("Trace");
console.log(JSON.stringify(simulation.trace, null, 2));
console.log("Logs");
console.log(JSON.stringify(simulation.logs, null, 2));
console.log("Asset Changes");
console.log(JSON.stringify(simulation.assetChanges, null, 2));
console.log("Balance Changes");
console.log(JSON.stringify(simulation.balanceChanges, null, 2));
Трассировка транзакций с помощью Viem
Используйте tenderly_traceTransaction, чтобы получить полностью декодированную трассировку транзакции.
node/samples/viem/2-transaction-trace.ts
const txTrace = await client.request({
method: "tenderly_traceTransaction",
params: [
// transaction hash
"0x6b2264fa8e28a641d834482d250080b39cbbf39251344573c7504d6137c4b793"
],
});
console.log("Logs");
console.log(JSON.stringify(txTrace.logs, null, 2));
console.log("=======================================================");
console.log("Asset Changes");
console.log(JSON.stringify(txTrace.assetChanges, null, 2));
console.log("=======================================================");
console.log("Balance Changes");
console.log(JSON.stringify(txTrace.balanceChanges, null, 2));
console.log("=======================================================");