contract-splitter
Version:
Split an EVM smart contract deployement bytecode into its sub components
114 lines (87 loc) • 6.23 kB
JavaScript
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;
});
});