Tenderly Simulate Asset Changes Snap
Tenderly MetaMask Snap Demo
प्रोजेक्ट ओवरव्यू
यह प्रोजेक्ट आपको दिखाता है कि transaction simulations को MetaMask wallet में कैसे एकीकृत करें। हम MetaMask Snaps के साथ काम करेंगे। आप सीखेंगे कि Tenderly Simulation API से कैसे जुड़ें, transaction डेटा भेजें, simulation परिणाम प्राप्त करें, और उन्हें MetaMask UI के माध्यम से उपयोगकर्ता को प्रदर्शित करें। इसमें डॉलर में asset परिवर्तन, native-asset balance परिवर्तन, output value, storage परिवर्तन, event logs, और call traces शामिल हैं। Simulated transactions को फिर आगे debugging और testing के लिए Tenderly में भी खोला जा सकता है। नीचे उन सुविधाओं की सूची है जो हम MetaMask Snap में जोड़ेंगे। समान सुविधाएँ किसी भी wallet में भी जोड़ी जा सकती हैं ताकि transactions भेजते समय उपयोगकर्ताओं को विश्वास बनाने में मदद मिले।| सुविधा | विवरण |
|---|---|
| Simulation debugging | Tenderly में simulation का निरीक्षण और debug करने के लिए ऑटो-जेनरेट किया गया लिंक। |
| सार्वजनिक रूप से साझा करने योग्य simulations | Simulations की सार्वजनिक साझेदारी को enable/disable करने की क्षमता। |
| डॉलर मूल्य में प्रदर्शित asset परिवर्तन | मानव-पठनीय डेटा, जिसमें डॉलर में स्वचालित रूप से परिवर्तित asset परिवर्तन शामिल हैं। |
| Native-asset balance परिवर्तन | contract के निष्पादन के दौरान उनके native-asset balance में परिवर्तनों को ट्रैक करने की क्षमता। |
| Output value | contract call का परिणाम देखें, यह दिखाते हुए कि contract क्या लौटाने के लिए सेट है। |
| Storage परिवर्तन | निष्पादन के दौरान contract के storage में किए गए किसी भी परिवर्तन को देखें। |
| Event logs | contract के निष्पादन के दौरान उत्सर्जित events देखें। |
| Call traces | निष्पादन के दौरान हुए सभी function कॉल्स का विवरण। |
आवश्यकताएँ
- MetaMask Flask ब्राउज़र एक्सटेंशन installed
- Node.js (संस्करण 16 या बाद का)
- Yarn (संस्करण 3)
MetaMask Snap बनाना शुरू करने से पहले, सुनिश्चित करें कि आप MetaMask के “वास्तविक” संस्करण को अक्षम कर दें
और MetaMask Flask Development
Plugin install करें।
चरण 1: एक MetaMask Snap प्रोजेक्ट सेटअप करना
MetaMask का आधिकारिक Create Snap CLI install करें और एक नया प्रोजेक्ट बनाएँ।example
example
example
सही अनुमतियाँ सेट करना
एक बार जब आप Snap install कर लें, तो/packages/snap/snap.manifest.json फ़ाइल खोजें और नीचे दिखाए अनुसार अनुमतियाँ सेट करें। MetaMask अनुमतियों के बारे में यहाँ जानें।
example.json
.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=fe280e95a931009bdc123e0018703f04)
चरण 2: Tenderly API एक्सेस टोकन उत्पन्न करना
MetaMask Snap में transaction preview विकल्प Tenderly Simulation API द्वारा संचालित है। API का उपयोग शुरू करने से पहले, आपको एक्सेस टोकन उत्पन्न करने होंगे। इन चरणों का पालन करें:- Tenderly में लॉग इन करें या यहाँ एक निःशुल्क खाता बनाएँ।
- Authorization page पर जाएँ और Generate Access Token बटन पर क्लिक करें।
API एक्सेस टोकन कैसे उत्पन्न करें
.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=605d334b40293766a111dd1651f30d92)
चरण 3: Snap के लिए logic लिखना
Snap को काम करने वाला मुख्य logic तीन फ़ाइलों में संग्रहीत है:- Credentials Access (
credentials-access.ts): Tenderly API प्रमाणीकरण और एक्सेस का प्रबंधन करता है। - Simulation (
simulation.ts): Tenderly API के साथ interact करने के लिए मुख्य logic ताकि transactions का simulation किया जा सके और simulation परिणाम प्राप्त किए जा सकें। - Formatter (
formatter.ts): simulation परिणामों को parse करने और उन्हें MetaMask UI में उपयोगकर्ता-अनुकूल तरीके से format करने के लिए logic।
Credentials Access
हम Tenderly API credentials का अनुरोध, अपडेट और fetch करने के लिए ज़िम्मेदार सभी विधियों को credentials-access.ts नामक फ़ाइल में संग्रहीत कर सकते हैं। यहाँ source code देखें। सबसे महत्वपूर्ण विधियाँ हैं:fetchCredentials(): यह function एक Tenderly project के credentials retrieve करता है। यदि कोई credentials संग्रहीत नहीं हैं, तो यह नए credentials का अनुरोध करने के लिएhandleUpdateTenderlyCredentialsको trigger करता है।handleUpdateTenderlyCredentials(): यह function Tenderly project credentials को अपडेट करने की प्रक्रिया को संभालता है। यहrequestNewTenderlyCredentialsको कॉल करके नए credentials प्राप्त करता है और फिर उन्हें'update'operation के साथsnap_manageStateविधि का उपयोग करके save करता है।requestNewTenderlyCredentials(): यह function नए Tenderly credentials का अनुरोध करता है। यह raw credentials डेटा प्राप्त करने के लिएrequestCredentialsको कॉल करता है औरaccountId,projectId, औरaccessTokenके साथ एक object लौटाने से पहले इसकी शुद्धता को सत्यापित करता है।
snap_manageState एक अंतर्निहित विधि है जो Snap को disk पर 100 MB तक डेटा को persist करने की अनुमति देती है। अधिक जानें यहाँ।
Simulation
इसके बाद, हमें वह logic बनाना होगा जो transaction डेटा को Tenderly Simulation API को भेजता है, इसका simulation करता है, और परिणाम retrieve करता है। हम इसके लिएsimulate API एंडपॉइंट का उपयोग करेंगे।
Endpoint: https://api.tenderly.co/api/v1/account/{accountId}/project/{projectId}/simulate
चीज़ों को व्यवस्थित रखने के लिए, चलिए simulation logic को simulation.ts नामक फ़ाइल में संग्रहीत करें। यहाँ source code देखें।
Tenderly Simulation API को transaction डेटा भेजने के लिए, हमें दो मुख्य विधियाँ बनानी होंगी:
- simulate(): यह मुख्य function है जो एक transaction के simulation को संभालता है। यह API एक्सेस credentials fetch करता है, transaction डेटा को Tenderly Simulation API को submit करता है, और API द्वारा लौटाई गई किसी भी त्रुटि को संभालता है।
example.tsx
- submitSimulation(): यह function transaction डेटा के साथ API को एक अनुरोध भेजता है ताकि उसका simulation किया जा सके।
example.tsx
Formatter
एक बार जब API simulation परिणाम लौटाती है, तो हमें इस डेटा को parse करना होगा और इसे MetaMask UI में प्रदर्शित करने के लिए उपयोगकर्ता-अनुकूल तरीके से format करना होगा। हम इस logic को formatter.ts नामक फ़ाइल में संग्रहीत कर सकते हैं। यहाँ source code देखें। मुख्य formatting विधियाँ हैं:formatResponse(): यह function एक Tenderly project simulation का raw डेटा और credentials प्राप्त करता है, प्रत्येक प्रासंगिक अनुभाग (जैसे balance परिवर्तन, output value, asset परिवर्तन, आदि) के लिए individual formatter functions को कॉल करता है, और सभी formatted outputs के साथ एक panel लौटाता है।formatBalanceDiff(): यह function transaction में शामिल प्रत्येक account के लिए balance परिवर्तन दिखाने वाला एक panel उत्पन्न करता है।formatOutputValue(): यह function एक panel बनाता है जो यदि कोई output मान मौजूद है तो transaction के output मानों को प्रस्तुत करता है। यह output को यदि संभव हो तो decode भी करता है।formatAssetChanges(): यह function किसी भी asset परिवर्तन को दिखाने के लिए एक panel format करता है, ERC20, ERC721, और अन्य परिवर्तनों के बीच अंतर करता है।formatStorageChanges(): यह function एक panel बनाता है जो transaction के दौरान हुए storage में किसी भी परिवर्तन को सूचीबद्ध करता है। स्पष्टता के लिए यह पते और nested डेटा संरचनाओं को विशिष्ट रूप से format करता है।formatEventLogs(): यह function प्रत्येक transaction के लिए event logs, यदि वे मौजूद हैं, प्रस्तुत करता है। Logs को पठनीयता के लिए format किया जाता है और इनमें input मान शामिल होते हैं।formatCallTrace(): यह function call traces का एक formatted दृश्य पदानुक्रम उत्पन्न करता है, nested कॉल्स को recursively दिखाता है।formatSimulationUrl(): यह function Tenderly Dashboard पर simulation के पूर्ण विवरण का एक लिंक और एक अलग shareable लिंक लौटाता है।
चरण 4: MetaMask UI में simulation डेटा प्रदर्शित करना
MetaMask Snap mono repo पूर्वनिर्धारित UI तत्वों और layout configurations का एक set प्रदान करता है। हम simulation परिणामों को प्रदर्शित करने के लिए मौजूदा MetaMask UI का विस्तार करने के लिए इन तत्वों का उपयोग करेंगे। जब आप हमारा MetaMask उदाहरण install करते हैं, तो हम आपको दिखाते हैं कि विभिन्न प्रकार के simulations कैसे चलाएँ:- एक पूर्वनिर्धारित payload के साथ सफल transaction simulation (सफल ERC-20 transfer और NFT transfer)
- एक पूर्वनिर्धारित payload के साथ विफल transaction simulation
- किसी भी payload के साथ कस्टम transaction simulation
%20(1).webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=c6f3c33067b72e0ac097fac8095498b0)
एक पूर्वनिर्धारित payload के साथ सफल simulation
Simulation शुरू करने के लिए, हम एक function लिखेंगे जो हमारे wallet पते से पूर्वनिर्धारित transaction डेटा भेजेगा औरeth_sendTransaction RPC विधि को कॉल करेगा।
example.tsx
eth_sendTransaction विधि call onTransaction handler को trigger करेगी, जो हमारे कस्टम simulate function को call करेगी, जिसे simulation.ts में परिभाषित किया गया था।
example.tsx
onTransaction handler में, simulate function को transaction और उसके origin को arguments के रूप में कॉल किया जाता है।
simulate function एक्सेस credentials fetch करने, transaction डेटा को Tenderly API को submit करने, किसी भी त्रुटि को संभालने और output के लिए API प्रतिक्रिया को format करने के लिए ज़िम्मेदार है।
Simulation के परिणाम MetaMask UI के भीतर प्रदर्शित होते हैं। नीचे दी गई छवियाँ demo.eth को 1 USDC का एक सफल ERC20 token transfer दिखाती हैं। Output formatter.ts फ़ाइल में परिभाषित functions द्वारा उत्पन्न होता है।
.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=bb92ed11d3534aae5065bb162b2d2a83)
formatAssetChanges() function द्वारा उत्पन्न होता है।
आपको simulated transaction का एक लिंक भी मिलता है जिसे आप Tenderly में खोल सकते हैं और Debugger के साथ इसका आगे निरीक्षण कर सकते हैं या इसे विभिन्न मानों के साथ resimulate कर सकते हैं।
यह लिंक formatter.ts फ़ाइल में परिभाषित formatSimulationUrl() function द्वारा उत्पन्न होता है।
example.ts
एक पूर्वनिर्धारित payload के साथ विफल transaction
दूसरे उदाहरण के लिए, हम एक पूर्वनिर्धारित payload के साथ एक विफल transaction का simulation करेंगे। नीचे दी गई छविdemo.eth को 1,000,000 USDC का एक विफल ERC20 token transfer दिखाती है।
.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=aba83c7ebdcd5583f17f53c9b21fe306)
एक कस्टम payload के साथ Simulation
एक कस्टम payload के साथ simulation चलाने के लिए, आपको एक ऐसा object जोड़ना होगा जो Ethereum transaction specification के अनुरूप हो।.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=3910b1ef37fc7a16edfc5718e7446df5)
from:DATA, 20 Bytes - वह पता जहाँ से transaction भेजा गया है।to:DATA, 20 Bytes - (नए contract बनाते समय वैकल्पिक) वह पता जहाँ transaction निर्देशित है।gas:QUANTITY- (वैकल्पिक, default: 90000) transaction निष्पादन के लिए प्रदान किए गए gas का Integer। यह अप्रयुक्त gas लौटाएगा।gasPrice:QUANTITY- (वैकल्पिक, default: निर्धारित किया जाना है) प्रत्येक paid gas के लिए उपयोग किए गएgasPriceका Integer।value:QUANTITY- (वैकल्पिक) इस transaction के साथ भेजे गए मान का Integer।data:DATA- एक contract का compiled code या invoked method signature और encoded पैरामीटर्स का hash।nonce:QUANTITY- (वैकल्पिक) एक nonce का Integer। यह आपको समान nonce का उपयोग करने वाले अपने स्वयं के pending transactions को overwrite करने की अनुमति देता है।
.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=6544e62caa22bfd1c5affec7c1f52792)
sendTransaction function का उपयोग करके simulation शुरू कर सकते हैं। यह कस्टम payload को onTransaction handler को पास करता है, जो फिर simulation चलाने के लिए simulate function को trigger करता है।