UNPKG

contract-splitter

Version:

Split an EVM smart contract deployement bytecode into its sub components

114 lines (87 loc) 6.23 kB
const splitter = require("../index"); const chai = require("chai"); const expect = chai.expect; // STANDARD BYTECODE : solc 0.8.7 // Deployed on Ropsten with arguments (a = 1, b = 2): https://ropsten.etherscan.io/tx/0xcf94b784bba70da289a5064819c239d476b01dd5f95a43304a63cee507ebcb35 // Tx hash : 0xcf94b784bba70da289a5064819c239d476b01dd5f95a43304a63cee507ebcb35 /* pragma solidity 0.8.7; contract Standard { constructor(uint256 a, uint256 b) { } } */ const STANDARD_BYTECODE_NO_ARGUMENTS = "6080604052348015600f57600080fd5b5060405160ee38038060ee8339818101604052810190602d91906046565b505060a2565b600081519050604081608e565b92915050565b60008060408385031215605a5760596089565b5b60006066858286016033565b92505060206075858286016033565b9150509250929050565b6000819050919050565b600080fd5b609581607f565b8114609f57600080fd5b50565b603f8060af6000396000f3fe6080604052600080fdfea26469706673582212200b3ba5344d33f945abe7e77b0478ee80d0e1c74d293750633d8701c2fade6f9c64736f6c63430008070033"; const STANDARD_BYTECODE_NO_ARGUMENTS_CONSTRUCTOR = "6080604052348015600f57600080fd5b5060405160ee38038060ee8339818101604052810190602d91906046565b505060a2565b600081519050604081608e565b92915050565b60008060408385031215605a5760596089565b5b60006066858286016033565b92505060206075858286016033565b9150509250929050565b6000819050919050565b600080fd5b609581607f565b8114609f57600080fd5b50565b603f8060af6000396000f3fe"; const STANDARD_BYTECODE_NO_ARGUMENTS_CONTRACT = "6080604052600080fdfea26469706673582212200b3ba5344d33f945abe7e77b0478ee80d0e1c74d293750633d8701c2fade6f9c64736f6c63430008070033"; const STANDARD_BYTECODE_NO_ARGUMENTS_METADATA = "a26469706673582212200b3ba5344d33f945abe7e77b0478ee80d0e1c74d293750633d8701c2fade6f9c64736f6c63430008070033"; const STANDARD_BYTECODE_WITH_ARGUMENTS = "6080604052348015600f57600080fd5b5060405160ee38038060ee8339818101604052810190602d91906046565b505060a2565b600081519050604081608e565b92915050565b60008060408385031215605a5760596089565b5b60006066858286016033565b92505060206075858286016033565b9150509250929050565b6000819050919050565b600080fd5b609581607f565b8114609f57600080fd5b50565b603f8060af6000396000f3fe6080604052600080fdfea2646970667358221220c87ae32fc63068beed8a787da3583f72f55c257933c23254f98bca3ca6fe829e64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"; const STANDARD_BYTECODE_WITH_ARGUMENTS_CONSTRUCTOR = "6080604052348015600f57600080fd5b5060405160ee38038060ee8339818101604052810190602d91906046565b505060a2565b600081519050604081608e565b92915050565b60008060408385031215605a5760596089565b5b60006066858286016033565b92505060206075858286016033565b9150509250929050565b6000819050919050565b600080fd5b609581607f565b8114609f57600080fd5b50565b603f8060af6000396000f3fe"; const STANDARD_BYTECODE_WITH_ARGUMENTS_CONTRACT = "6080604052600080fdfea2646970667358221220c87ae32fc63068beed8a787da3583f72f55c257933c23254f98bca3ca6fe829e64736f6c63430008070033"; const STANDARD_BYTECODE_WITH_ARGUMENTS_METADATA = "a2646970667358221220c87ae32fc63068beed8a787da3583f72f55c257933c23254f98bca3ca6fe829e64736f6c63430008070033"; const STANDARD_BYTECODE_WITH_ARGUMENTS_ARGUMENTS = "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"; // STANDARD_BYTECODE with "8060ee8339" (codecopy) partly removed const NON_STANDARD_BYTECODE = "6080604052348015600f57600080fd5b5060405160ee38038060ee8339818101604052810190602d91906046565b505060a2565b600081519050604081608e565b92915050565b60008060408385031215605a5760596089565b5b60006066858286016033565b92505060206075858286016033565b9150509250929050565b6000819050919050565b600080fd5b609581607f565b8114609f57600080fd5b50565b603f8060af6000396000f3fe6080604052600080fdfea26469706673582212200b3ba5344d33f945abe7e77b0478ee80d0e1c74d293750633d8701c2fade6f9c64736f6c63430008070033"; describe("Split a standard deployement bytecode WITHOUT arguments", async () => { it("Should split the bytecode and not throw any error", () => { expect(splitter(STANDARD_BYTECODE_NO_ARGUMENTS)).to.not.throw; }); it("Should correctly isolate the constructor bytecode", () => { const split = splitter(STANDARD_BYTECODE_NO_ARGUMENTS); expect(split.constructor).to.equal( STANDARD_BYTECODE_NO_ARGUMENTS_CONSTRUCTOR ); }); it("Should correctly isolate the contract bytecode", () => { const split = splitter(STANDARD_BYTECODE_NO_ARGUMENTS); expect(split.contract).to.equal(STANDARD_BYTECODE_NO_ARGUMENTS_CONTRACT); }); it("Should correctly isolate the contract metadata", () => { const split = splitter(STANDARD_BYTECODE_NO_ARGUMENTS); expect(split.metadata).to.equal(STANDARD_BYTECODE_NO_ARGUMENTS_METADATA); }); it("Should not find any arguments", () => { const split = splitter(STANDARD_BYTECODE_NO_ARGUMENTS); expect(split.arguments).to.equal(""); }); }); describe("Split a standard deployement bytecode WITH arguments", async () => { it("Should split the bytecode and not throw any error", () => { expect(splitter(STANDARD_BYTECODE_WITH_ARGUMENTS)).to.not.throw; }); it("Should correctly isolate the constructor bytecode", () => { const split = splitter(STANDARD_BYTECODE_WITH_ARGUMENTS); expect(split.constructor).to.equal( STANDARD_BYTECODE_WITH_ARGUMENTS_CONSTRUCTOR ); }); it("Should correctly isolate the contract bytecode", () => { const split = splitter(STANDARD_BYTECODE_WITH_ARGUMENTS); expect(split.contract).to.equal(STANDARD_BYTECODE_WITH_ARGUMENTS_CONTRACT); }); it("Should correctly isolate the contract metadata", () => { const split = splitter(STANDARD_BYTECODE_WITH_ARGUMENTS); expect(split.metadata).to.equal(STANDARD_BYTECODE_WITH_ARGUMENTS_METADATA); }); it("Should correctly isolate the arguments", () => { const split = splitter(STANDARD_BYTECODE_WITH_ARGUMENTS); expect(split.arguments).to.equal( STANDARD_BYTECODE_WITH_ARGUMENTS_ARGUMENTS ); }); }); describe("Split a non standard deployement bytecode", async () => { it("Should not split the bytecode and throw an error", () => { expect(splitter(NON_STANDARD_BYTECODE)).to.throw; }); });