{"id":873,"date":"2023-09-21T02:26:36","date_gmt":"2023-09-20T18:26:36","guid":{"rendered":"https:\/\/vinta.ws\/code\/?p=873"},"modified":"2026-03-17T00:41:39","modified_gmt":"2026-03-16T16:41:39","slug":"solidity-abi-encode-vs-abi-encodepacked-vs-abi-encodewithsignature-vs-abi-encodecall","status":"publish","type":"post","link":"https:\/\/vinta.ws\/code\/solidity-abi-encode-vs-abi-encodepacked-vs-abi-encodewithsignature-vs-abi-encodecall.html","title":{"rendered":"Demystifying Solidity ABI Encoding"},"content":{"rendered":"<p>There are some encode\/decode functions in Solidity, for instance:<\/p>\n<ul>\n<li><code>abi.encode()<\/code> will concatenate all values and add padding to fit into 32 bytes for each value.\n<ul>\n<li>To integrate with other contracts, you should use <code>abi.encode()<\/code>.<\/li>\n<\/ul>\n<\/li>\n<li><code>abi.encodePacked()<\/code> will concatenate all values in the exact byte representations without padding.\n<ul>\n<li>If you only need to store it, you should use <code>abi.encodePacked()<\/code> since it's smaller.<\/li>\n<\/ul>\n<\/li>\n<li><code>abi.encodeWithSignature()<\/code> is mainly used to call functions in another contract.<\/li>\n<li><code>abi.encodeCall()<\/code> is the type-safe version of <code>abi.encodeWithSignature()<\/code>, required 0.8.11+.<\/li>\n<\/ul>\n<pre class=\"line-numbers\"><code class=\"language-solidity\">pragma solidity &gt;=0.8.19;\n\nimport { IERC20 } from \"openzeppelin-contracts\/contracts\/token\/ERC20\/IERC20.sol\";\nimport \"forge-std\/Test.sol\";\n\ncontract MyTest is Test {\n    function test_abi_encode() public {\n        bytes memory result = abi.encode(uint8(1), uint16(2), uint24(3));\n        console.logBytes(result);\n        \/\/ 0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003\n        \/\/ total 32 bytes * 3 = 96 bytes\n    }\n\n    function test_abi_encodePacked() public {\n        bytes memory resultPacked = abi.encodePacked(uint8(1), uint16(2), uint24(3));\n        console.logBytes(resultPacked);\n        \/\/ 0x010002000003\n        \/\/ total 1 byte + 2 bytes + 3 bytes = 6 bytes\n    }\n\n    function test_abi_encodeWithSignature() public {\n        address weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n        address vitalik = 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045;\n        bytes memory data = abi.encodeWithSignature(\"balanceOf(address)\", vitalik);\n        console.logBytes(data);\n        (bool success, bytes memory result) = weth.call(data);\n        console.logBool(success);\n        console.logUint(abi.decode(result, (uint256)));\n    }\n\n    function test_abi_encodeCall() public {\n        address weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n        address vitalik = 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045;\n        bytes memory data = abi.encodeCall(IERC20.balanceOf, (vitalik));\n        console.logBytes(data);\n        (bool success, bytes memory result) = weth.call(data);\n        console.logBool(success);\n        console.logUint(abi.decode(result, (uint256)));\n    }\n}<\/code><\/pre>\n<pre class=\"line-numbers\"><code class=\"language-bash\">forge test --mc \"MyTest\" -vv --fork-url https:\/\/rpc.flashbots.net<\/code><\/pre>\n<p>ref:<br \/>\n<a href=\"https:\/\/github.com\/AmazingAng\/WTF-Solidity\/tree\/main\/27_ABIEncode\">https:\/\/github.com\/AmazingAng\/WTF-Solidity\/tree\/main\/27_ABIEncode<\/a><br \/>\n<a href=\"https:\/\/trustchain.medium.com\/abi-functions-explained-in-solidity-bd93cf88bdf2\">https:\/\/trustchain.medium.com\/abi-functions-explained-in-solidity-bd93cf88bdf2<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>There many encode functions in Solidity.<\/p>\n","protected":false},"author":1,"featured_media":874,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[137],"tags":[138,146,147,143],"class_list":["post-873","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blockchain","tag-ethereum","tag-foundry","tag-smart-contract","tag-solidity"],"_links":{"self":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/posts\/873","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/comments?post=873"}],"version-history":[{"count":0,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/posts\/873\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/media\/874"}],"wp:attachment":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/media?parent=873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/categories?post=873"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/tags?post=873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}