मुख्य सामग्री पर जाएं
State overrides आपको अपने simulation के उद्देश्य से नेटवर्क state को अनुकूलित करने की अनुमति देते हैं। यह सुविधा तब उपयोगी होती है जब आपको उन स्थितियों में परिदृश्यों का परीक्षण करने की आवश्यकता होती है जो वर्तमान में लाइव नेटवर्क पर मौजूद नहीं हैं। API के बजाय dashboard के माध्यम से समान overrides लागू करने के लिए, Simulator UI में state overrides देखें। यह दिखाने के लिए कि state overrides कैसे काम करते हैं, आइए DAI stablecoin contract का उपयोग करें। DAI सिस्टम में, कुछ क्रियाएँ, जैसे नए DAI tokens minting, केवल wards के रूप में नामित पतों द्वारा ही की जा सकती हैं। यदि आपका पता ward नहीं है, तो आप minting operations का परीक्षण नहीं कर सकते।

State overrides के माध्यम से ward के रूप में सेटअप करना

DAI mint करने वाले transaction का simulation करने के लिए, हमें state को override करना होगा ताकि हमारा पता ward के रूप में दिखाई दे। हमें DAI contract में wards map को अपने पते और आवश्यक अनुमतियों के साथ शामिल करने के लिए समायोजित करना होगा। Mint करने में सक्षम होने के लिए, transaction का sender एक ward होना चाहिए। दूसरे शब्दों में, निम्नलिखित शर्त पूरी होनी चाहिए: wards['0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2'] == 1 API अनुरोध में, overrides का एक map state_objects ऑब्जेक्ट को असाइन करें। यह map smart contract में विशिष्ट स्टोरेज स्थानों की ओर इशारा करता है और simulation के लिए नए मान असाइन करता है।
  • DAI contract पता: 0x6b175474e89094c44da98b954eedeac495271d0f
  • स्टोरेज स्लॉट स्थान: 0xedd7d04419e9c48ceb6055956cbb4e2091ae310313a4d1fa7cbcfe7561616e03
  • Override मान: 0x0000000000000000000000000000000000000000000000000000000000000001
example.json
{
  "state_objects": {
    "0x6b175474e89094c44da98b954eedeac495271d0f": {
      "storage": {
        "0xedd7d04419e9c48ceb6055956cbb4e2091ae310313a4d1fa7cbcfe7561616e03": "0x0000000000000000000000000000000000000000000000000000000000000001"
      }
    }
  }
}
नीचे दी गई script दिखाती है कि overrides को कैसे सेट करें और Simulation API को अनुरोध कैसे भेजें। सुनिश्चित करें कि TENDERLY_ACCOUNT_SLUG और TENDERLY_ACCESS_KEY को environment variables के रूप में सेट किया गया है। slug और एक्सेस कुंजी प्राप्त करना सीखें।
example.ts

dotenv.config();

// assuming environment variables TENDERLY_ACCOUNT_SLUG, TENDERLY_PROJECT_SLUG and TENDERLY_ACCESS_KEY are set
// https://docs.tenderly.co/platform/account/projects/slug
// https://docs.tenderly.co/platform/account/projects/api-tokens
const { TENDERLY_ACCOUNT_SLUG, TENDERLY_PROJECT_SLUG, TENDERLY_ACCESS_KEY } = process.env;

const mintDai = async () => {
  console.time('Simulation');
  const fakeWardAddress = '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2';
  // calculate the storage location of `wards[fakeWardAddress]`
  // yields 0xedd7d04419e9c48ceb6055956cbb4e2091ae310313a4d1fa7cbcfe7561616e03
  const overrideStorageLocation = ethers.utils.keccak256(
    ethers.utils.concat([
      ethers.utils.hexZeroPad(fakeWardAddress, 32), // the ward address (address 0x000..0) - mapping key
      ethers.utils.hexZeroPad('0x0', 32), // the wards slot is 0th in the DAI contract - the mapping variable
    ]),
  );
  console.log('Storage Override Location', overrideStorageLocation);
  const mint = (
    await axios.post(
      `https://api.tenderly.co/api/v1/account/${TENDERLY_ACCOUNT_SLUG}/project/${TENDERLY_PROJECT_SLUG}/simulate`,
      // the transaction
      {
        save: true,
        save_if_fails: true,
        simulation_type: 'full',
        network_id: '1',
        from: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2',
        to: '0x6b175474e89094c44da98b954eedeac495271d0f',
        input:
          '0x40c10f19000000000000000000000000e58b9ee93700a616b50509c8292977fa7a0f8ce10000000000000000000000000000000000000000000000001bc16d674ec80000',
        gas: 8000000,
        state_objects: {
          '0x6b175474e89094c44da98b954eedeac495271d0f': {
            storage: {
              '0xedd7d04419e9c48ceb6055956cbb4e2091ae310313a4d1fa7cbcfe7561616e03':
                '0x0000000000000000000000000000000000000000000000000000000000000001',
            },
          },
        },
      },
      {
        headers: {
          'X-Access-Key': TENDERLY_ACCESS_KEY as string,
        },
      },
    )
  ).data;

  console.timeEnd('Simulation');
  console.log(JSON.stringify(mint, null, 2));
  // TODO: extract token transferred
};

mintDai();

Storage Slot गणना

एक override सेट करने का मुख्य भाग सही स्टोरेज स्थान की गणना करना है। यह contract के स्टोरेज की संरचना और उस विशिष्ट variable पर निर्भर करता है जिसे आप override करना चाहते हैं। DAI contract के लिए, हमारे पते के लिए wards mapping का स्टोरेज स्थान Solidity स्टोरेज layout नियमों के आधार पर गणना की जाती है, और इस अभिव्यक्ति द्वारा दिया जाता है:
example.js
const fakeWardAddress = '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2';
const overrideStorageLocation = keccak256(
  concatenate(
    hexZeroPad(fakeWardAddress), hexZeroPad(0x0)
  )
)
हमारे उदाहरण में, स्टोरेज स्थान है: 0xedd7d04419e9c48ceb6055956cbb4e2091ae310313a4d1fa7cbcfe7561616e03

जानें

Gnosis Safe contracts को कैसे override करें