# ERC721 precompile Using address at 'nft', it works well. Find more [here](https://github.com/cennznet/wiki/blob/spike/precompileERC721/EVM/ERC721-precompile.md) Test contract to use ERC721 precompile on CENNZnet chain. ``` pragma solidity ^0.8.13; import "@openzeppelin/contracts/interfaces/IERC721.sol"; import "@openzeppelin/contracts/interfaces/IERC165.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; contract Test { address nft = 0xaAAAaaAA00000000000000000000000000000000; function balanceOfProxy(address who) public view returns (uint256) { return IERC721(nft).balanceOf(who); } function ownerOfProxy(uint256 tokenId) public view returns (address) { return IERC721(nft).ownerOf(tokenId); } function nameOfNFT() public view returns (string memory) { return IERC721Metadata(nft).name(); } function symbolOfNFT() public view returns (string memory) { return IERC721Metadata(nft).symbol(); } function tokenURIOfNFT(uint256 serial_number) public view returns (string memory) { return IERC721Metadata(nft).tokenURI(serial_number); } function transferFromProxy( uint256 serial_number ) external { IERC721(nft).transferFrom(0x89A1421e1482FA467F6E2FBC4decBaE8a4A6A065, msg.sender, serial_number); } function approveFromProxy( uint256 serial_number ) external { IERC721(nft).approve(address(this), serial_number); } } ``` Calling within a smart contract transaction, fails with error ***VM Exception while processing transaction: revert*** Investigation till now Revert is due to invalid opcode while executing the transaction. https://medium.com/@cpluser/how-evm-opcodes-run-in-sputnikvm-rust-part-1-6dbe74fd0190 provides more information on how opcodes run in rust The compiled EVM byte code for NFT contract looks like ``` solc --bin --asm test-ts/contracts/NFT.sol ======= test-ts/contracts/NFT.sol:IERC721 ======= EVM assembly: Binary: ======= test-ts/contracts/NFT.sol:NFT ======= EVM assembly: /* "test-ts/contracts/NFT.sol":335:852 contract NFT {... */ mstore(0x40, 0x80) /* "test-ts/contracts/NFT.sol":491:533 0xaAAAaaAA00000000000000000000000000000000 */ 0xaaaaaaaa00000000000000000000000000000000 /* "test-ts/contracts/NFT.sol":477:533 address nft = 0xaAAAaaAA00000000000000000000000000000000 */ 0x00 dup1 0x0100 exp dup2 sload dup2 0xffffffffffffffffffffffffffffffffffffffff mul not and swap1 dup4 0xffffffffffffffffffffffffffffffffffffffff and mul or swap1 sstore pop /* "test-ts/contracts/NFT.sol":335:852 contract NFT {... */ callvalue dup1 iszero tag_1 jumpi 0x00 dup1 revert tag_1: pop dataSize(sub_0) dup1 dataOffset(sub_0) 0x00 codecopy 0x00 return stop sub_0: assembly { /* "test-ts/contracts/NFT.sol":335:852 contract NFT {... */ mstore(0x40, 0x80) callvalue dup1 iszero tag_1 jumpi 0x00 dup1 revert tag_1: pop jumpi(tag_2, lt(calldatasize, 0x04)) shr(0xe0, calldataload(0x00)) dup1 0x2b2cf0df eq tag_3 jumpi dup1 0x382904fa eq tag_4 jumpi tag_2: 0x00 dup1 revert /* "test-ts/contracts/NFT.sol":711:850 function approveFromProxy(address to,... */ tag_3: tag_5 0x04 dup1 calldatasize sub dup2 add swap1 tag_6 swap2 swap1 tag_7 jump // in tag_6: tag_8 jump // in tag_5: stop /* "test-ts/contracts/NFT.sol":540:705 function transferFromProxy(address to, address from,... */ tag_4: tag_9 0x04 dup1 calldatasize sub dup2 add swap1 tag_10 swap2 swap1 tag_11 jump // in tag_10: tag_12 jump // in tag_9: stop /* "test-ts/contracts/NFT.sol":711:850 function approveFromProxy(address to,... */ tag_8: /* "test-ts/contracts/NFT.sol":812:815 nft */ 0x00 dup1 sload swap1 0x0100 exp swap1 div 0xffffffffffffffffffffffffffffffffffffffff and /* "test-ts/contracts/NFT.sol":804:824 IERC721(nft).approve */ 0xffffffffffffffffffffffffffffffffffffffff and 0x095ea7b3 /* "test-ts/contracts/NFT.sol":825:827 to */ dup4 /* "test-ts/contracts/NFT.sol":829:842 serial_number */ dup4 /* "test-ts/contracts/NFT.sol":804:843 IERC721(nft).approve(to, serial_number) */ mload(0x40) dup4 0xffffffff and 0xe0 shl dup2 mstore 0x04 add tag_14 swap3 swap2 swap1 tag_15 jump // in tag_14: 0x00 mload(0x40) dup1 dup4 sub dup2 0x00 dup8 dup1 extcodesize iszero dup1 iszero tag_16 jumpi 0x00 dup1 revert tag_16: pop gas call iszero dup1 iszero tag_18 jumpi returndatasize 0x00 dup1 returndatacopy revert(0x00, returndatasize) tag_18: pop pop pop pop /* "test-ts/contracts/NFT.sol":711:850 function approveFromProxy(address to,... */ pop pop jump // out /* "test-ts/contracts/NFT.sol":540:705 function transferFromProxy(address to, address from,... */ tag_12: /* "test-ts/contracts/NFT.sol":656:659 nft */ 0x00 dup1 sload swap1 0x0100 exp swap1 div 0xffffffffffffffffffffffffffffffffffffffff and /* "test-ts/contracts/NFT.sol":648:673 IERC721(nft).transferFrom */ 0xffffffffffffffffffffffffffffffffffffffff and 0x23b872dd /* "test-ts/contracts/NFT.sol":674:676 to */ dup5 /* "test-ts/contracts/NFT.sol":678:682 from */ dup5 /* "test-ts/contracts/NFT.sol":684:697 serial_number */ dup5 /* "test-ts/contracts/NFT.sol":648:698 IERC721(nft).transferFrom(to, from, serial_number) */ mload(0x40) dup5 0xffffffff and 0xe0 shl dup2 mstore 0x04 add tag_20 swap4 swap3 swap2 swap1 tag_21 jump // in tag_20: 0x00 mload(0x40) dup1 dup4 sub dup2 0x00 dup8 dup1 extcodesize iszero dup1 iszero tag_22 jumpi 0x00 dup1 revert tag_22: pop gas call iszero dup1 iszero tag_24 jumpi returndatasize 0x00 dup1 returndatacopy revert(0x00, returndatasize) tag_24: pop pop pop pop /* "test-ts/contracts/NFT.sol":540:705 function transferFromProxy(address to, address from,... */ pop pop pop jump // out /* "#utility.yul":88:205 */ tag_26: /* "#utility.yul":197:198 */ 0x00 /* "#utility.yul":194:195 */ dup1 /* "#utility.yul":187:199 */ revert /* "#utility.yul":334:460 */ tag_28: /* "#utility.yul":371:378 */ 0x00 /* "#utility.yul":411:453 */ 0xffffffffffffffffffffffffffffffffffffffff /* "#utility.yul":404:409 */ dup3 /* "#utility.yul":400:454 */ and /* "#utility.yul":389:454 */ swap1 pop /* "#utility.yul":334:460 */ swap2 swap1 pop jump // out /* "#utility.yul":466:562 */ tag_29: /* "#utility.yul":503:510 */ 0x00 /* "#utility.yul":532:556 */ tag_43 /* "#utility.yul":550:555 */ dup3 /* "#utility.yul":532:556 */ tag_28 jump // in tag_43: /* "#utility.yul":521:556 */ swap1 pop /* "#utility.yul":466:562 */ swap2 swap1 pop jump // out /* "#utility.yul":568:690 */ tag_30: /* "#utility.yul":641:665 */ tag_45 /* "#utility.yul":659:664 */ dup2 /* "#utility.yul":641:665 */ tag_29 jump // in tag_45: /* "#utility.yul":634:639 */ dup2 /* "#utility.yul":631:666 */ eq /* "#utility.yul":621:684 */ tag_46 jumpi /* "#utility.yul":680:681 */ 0x00 /* "#utility.yul":677:678 */ dup1 /* "#utility.yul":670:682 */ revert /* "#utility.yul":621:684 */ tag_46: /* "#utility.yul":568:690 */ pop jump // out /* "#utility.yul":696:835 */ tag_31: /* "#utility.yul":742:747 */ 0x00 /* "#utility.yul":780:786 */ dup2 /* "#utility.yul":767:787 */ calldataload /* "#utility.yul":758:787 */ swap1 pop /* "#utility.yul":796:829 */ tag_48 /* "#utility.yul":823:828 */ dup2 /* "#utility.yul":796:829 */ tag_30 jump // in tag_48: /* "#utility.yul":696:835 */ swap3 swap2 pop pop jump // out /* "#utility.yul":841:918 */ tag_32: /* "#utility.yul":878:885 */ 0x00 /* "#utility.yul":907:912 */ dup2 /* "#utility.yul":896:912 */ swap1 pop /* "#utility.yul":841:918 */ swap2 swap1 pop jump // out /* "#utility.yul":924:1046 */ tag_33: /* "#utility.yul":997:1021 */ tag_51 /* "#utility.yul":1015:1020 */ dup2 /* "#utility.yul":997:1021 */ tag_32 jump // in tag_51: /* "#utility.yul":990:995 */ dup2 /* "#utility.yul":987:1022 */ eq /* "#utility.yul":977:1040 */ tag_52 jumpi /* "#utility.yul":1036:1037 */ 0x00 /* "#utility.yul":1033:1034 */ dup1 /* "#utility.yul":1026:1038 */ revert /* "#utility.yul":977:1040 */ tag_52: /* "#utility.yul":924:1046 */ pop jump // out /* "#utility.yul":1052:1191 */ tag_34: /* "#utility.yul":1098:1103 */ 0x00 /* "#utility.yul":1136:1142 */ dup2 /* "#utility.yul":1123:1143 */ calldataload /* "#utility.yul":1114:1143 */ swap1 pop /* "#utility.yul":1152:1185 */ tag_54 /* "#utility.yul":1179:1184 */ dup2 /* "#utility.yul":1152:1185 */ tag_33 jump // in tag_54: /* "#utility.yul":1052:1191 */ swap3 swap2 pop pop jump // out /* "#utility.yul":1197:1671 */ tag_7: /* "#utility.yul":1265:1271 */ 0x00 /* "#utility.yul":1273:1279 */ dup1 /* "#utility.yul":1322:1324 */ 0x40 /* "#utility.yul":1310:1319 */ dup4 /* "#utility.yul":1301:1308 */ dup6 /* "#utility.yul":1297:1320 */ sub /* "#utility.yul":1293:1325 */ slt /* "#utility.yul":1290:1409 */ iszero tag_56 jumpi /* "#utility.yul":1328:1407 */ tag_57 tag_26 jump // in tag_57: /* "#utility.yul":1290:1409 */ tag_56: /* "#utility.yul":1448:1449 */ 0x00 /* "#utility.yul":1473:1526 */ tag_58 /* "#utility.yul":1518:1525 */ dup6 /* "#utility.yul":1509:1515 */ dup3 /* "#utility.yul":1498:1507 */ dup7 /* "#utility.yul":1494:1516 */ add /* "#utility.yul":1473:1526 */ tag_31 jump // in tag_58: /* "#utility.yul":1463:1526 */ swap3 pop /* "#utility.yul":1419:1536 */ pop /* "#utility.yul":1575:1577 */ 0x20 /* "#utility.yul":1601:1654 */ tag_59 /* "#utility.yul":1646:1653 */ dup6 /* "#utility.yul":1637:1643 */ dup3 /* "#utility.yul":1626:1635 */ dup7 /* "#utility.yul":1622:1644 */ add /* "#utility.yul":1601:1654 */ tag_34 jump // in tag_59: /* "#utility.yul":1591:1654 */ swap2 pop /* "#utility.yul":1546:1664 */ pop /* "#utility.yul":1197:1671 */ swap3 pop swap3 swap1 pop jump // out /* "#utility.yul":1677:2296 */ tag_11: /* "#utility.yul":1754:1760 */ 0x00 /* "#utility.yul":1762:1768 */ dup1 /* "#utility.yul":1770:1776 */ 0x00 /* "#utility.yul":1819:1821 */ 0x60 /* "#utility.yul":1807:1816 */ dup5 /* "#utility.yul":1798:1805 */ dup7 /* "#utility.yul":1794:1817 */ sub /* "#utility.yul":1790:1822 */ slt /* "#utility.yul":1787:1906 */ iszero tag_61 jumpi /* "#utility.yul":1825:1904 */ tag_62 tag_26 jump // in tag_62: /* "#utility.yul":1787:1906 */ tag_61: /* "#utility.yul":1945:1946 */ 0x00 /* "#utility.yul":1970:2023 */ tag_63 /* "#utility.yul":2015:2022 */ dup7 /* "#utility.yul":2006:2012 */ dup3 /* "#utility.yul":1995:2004 */ dup8 /* "#utility.yul":1991:2013 */ add /* "#utility.yul":1970:2023 */ tag_31 jump // in tag_63: /* "#utility.yul":1960:2023 */ swap4 pop /* "#utility.yul":1916:2033 */ pop /* "#utility.yul":2072:2074 */ 0x20 /* "#utility.yul":2098:2151 */ tag_64 /* "#utility.yul":2143:2150 */ dup7 /* "#utility.yul":2134:2140 */ dup3 /* "#utility.yul":2123:2132 */ dup8 /* "#utility.yul":2119:2141 */ add /* "#utility.yul":2098:2151 */ tag_31 jump // in tag_64: /* "#utility.yul":2088:2151 */ swap3 pop /* "#utility.yul":2043:2161 */ pop /* "#utility.yul":2200:2202 */ 0x40 /* "#utility.yul":2226:2279 */ tag_65 /* "#utility.yul":2271:2278 */ dup7 /* "#utility.yul":2262:2268 */ dup3 /* "#utility.yul":2251:2260 */ dup8 /* "#utility.yul":2247:2269 */ add /* "#utility.yul":2226:2279 */ tag_34 jump // in tag_65: /* "#utility.yul":2216:2279 */ swap2 pop /* "#utility.yul":2171:2289 */ pop /* "#utility.yul":1677:2296 */ swap3 pop swap3 pop swap3 jump // out /* "#utility.yul":2302:2420 */ tag_35: /* "#utility.yul":2389:2413 */ tag_67 /* "#utility.yul":2407:2412 */ dup2 /* "#utility.yul":2389:2413 */ tag_29 jump // in tag_67: /* "#utility.yul":2384:2387 */ dup3 /* "#utility.yul":2377:2414 */ mstore /* "#utility.yul":2302:2420 */ pop pop jump // out /* "#utility.yul":2426:2544 */ tag_36: /* "#utility.yul":2513:2537 */ tag_69 /* "#utility.yul":2531:2536 */ dup2 /* "#utility.yul":2513:2537 */ tag_32 jump // in tag_69: /* "#utility.yul":2508:2511 */ dup3 /* "#utility.yul":2501:2538 */ mstore /* "#utility.yul":2426:2544 */ pop pop jump // out /* "#utility.yul":2550:2882 */ tag_15: /* "#utility.yul":2671:2675 */ 0x00 /* "#utility.yul":2709:2711 */ 0x40 /* "#utility.yul":2698:2707 */ dup3 /* "#utility.yul":2694:2712 */ add /* "#utility.yul":2686:2712 */ swap1 pop /* "#utility.yul":2722:2793 */ tag_71 /* "#utility.yul":2790:2791 */ 0x00 /* "#utility.yul":2779:2788 */ dup4 /* "#utility.yul":2775:2792 */ add /* "#utility.yul":2766:2772 */ dup6 /* "#utility.yul":2722:2793 */ tag_35 jump // in tag_71: /* "#utility.yul":2803:2875 */ tag_72 /* "#utility.yul":2871:2873 */ 0x20 /* "#utility.yul":2860:2869 */ dup4 /* "#utility.yul":2856:2874 */ add /* "#utility.yul":2847:2853 */ dup5 /* "#utility.yul":2803:2875 */ tag_36 jump // in tag_72: /* "#utility.yul":2550:2882 */ swap4 swap3 pop pop pop jump // out /* "#utility.yul":2888:3330 */ tag_21: /* "#utility.yul":3037:3041 */ 0x00 /* "#utility.yul":3075:3077 */ 0x60 /* "#utility.yul":3064:3073 */ dup3 /* "#utility.yul":3060:3078 */ add /* "#utility.yul":3052:3078 */ swap1 pop /* "#utility.yul":3088:3159 */ tag_74 /* "#utility.yul":3156:3157 */ 0x00 /* "#utility.yul":3145:3154 */ dup4 /* "#utility.yul":3141:3158 */ add /* "#utility.yul":3132:3138 */ dup7 /* "#utility.yul":3088:3159 */ tag_35 jump // in tag_74: /* "#utility.yul":3169:3241 */ tag_75 /* "#utility.yul":3237:3239 */ 0x20 /* "#utility.yul":3226:3235 */ dup4 /* "#utility.yul":3222:3240 */ add /* "#utility.yul":3213:3219 */ dup6 /* "#utility.yul":3169:3241 */ tag_35 jump // in tag_75: /* "#utility.yul":3251:3323 */ tag_76 /* "#utility.yul":3319:3321 */ 0x40 /* "#utility.yul":3308:3317 */ dup4 /* "#utility.yul":3304:3322 */ add /* "#utility.yul":3295:3301 */ dup5 /* "#utility.yul":3251:3323 */ tag_36 jump // in tag_76: /* "#utility.yul":2888:3330 */ swap5 swap4 pop pop pop pop jump // out auxdata: 0xa2646970667358221220b35361bce10e8d50efb46995825ff7c586989d5f73c6eb8776f6d2154c6ba39764736f6c63430008100033 } Binary: 608060405273aaaaaaaa000000000000000000000000000000006000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561006457600080fd5b50610378806100746000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632b2cf0df1461003b578063382904fa14610057575b600080fd5b61005560048036038101906100509190610231565b610073565b005b610071600480360381019061006c9190610271565b610104565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b81526004016100ce9291906102e2565b600060405180830381600087803b1580156100e857600080fd5b505af11580156100fc573d6000803e3d6000fd5b505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8484846040518463ffffffff1660e01b81526004016101619392919061030b565b600060405180830381600087803b15801561017b57600080fd5b505af115801561018f573d6000803e3d6000fd5b50505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101c88261019d565b9050919050565b6101d8816101bd565b81146101e357600080fd5b50565b6000813590506101f5816101cf565b92915050565b6000819050919050565b61020e816101fb565b811461021957600080fd5b50565b60008135905061022b81610205565b92915050565b6000806040838503121561024857610247610198565b5b6000610256858286016101e6565b92505060206102678582860161021c565b9150509250929050565b60008060006060848603121561028a57610289610198565b5b6000610298868287016101e6565b93505060206102a9868287016101e6565b92505060406102ba8682870161021c565b9150509250925092565b6102cd816101bd565b82525050565b6102dc816101fb565b82525050565b60006040820190506102f760008301856102c4565b61030460208301846102d3565b9392505050565b600060608201905061032060008301866102c4565b61032d60208301856102c4565b61033a60408301846102d3565b94935050505056fea2646970667358221220b35361bce10e8d50efb46995825ff7c586989d5f73c6eb8776f6d2154c6ba39764736f6c63430008100033 ``` And for erc20 contract ``` pragma solidity ^0.8.13; import "@openzeppelin/contracts/interfaces/IERC20.sol"; // import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; // import "@openzeppelin/contracts/interfaces/IERC165.sol"; contract abc { // CENNZ testnet address with assetId 16000 address cennz = 0xcCccccCc00003E80000000000000000000000000; function balanceOfProxy(address who) public view returns (uint256) { return IERC20(cennz).balanceOf(who); } function transferFromProxy(uint256 amount) external { IERC20(cennz).transferFrom(msg.sender, address(this), amount); } } ``` Bytecode is ``` ======= test-ts/contracts/ERC20.sol:abc ======= EVM assembly: /* "test-ts/contracts/ERC20.sol":233:622 contract abc {... */ mstore(0x40, 0x80) /* "test-ts/contracts/ERC20.sol":316:358 0xcCccccCc00003E80000000000000000000000000 */ 0xcccccccc00003e80000000000000000000000000 /* "test-ts/contracts/ERC20.sol":300:358 address cennz = 0xcCccccCc00003E80000000000000000000000000 */ 0x00 dup1 0x0100 exp dup2 sload dup2 0xffffffffffffffffffffffffffffffffffffffff mul not and swap1 dup4 0xffffffffffffffffffffffffffffffffffffffff and mul or swap1 sstore pop /* "test-ts/contracts/ERC20.sol":233:622 contract abc {... */ callvalue dup1 iszero tag_1 jumpi 0x00 dup1 revert tag_1: pop dataSize(sub_0) dup1 dataOffset(sub_0) 0x00 codecopy 0x00 return stop sub_0: assembly { /* "test-ts/contracts/ERC20.sol":233:622 contract abc {... */ mstore(0x40, 0x80) callvalue dup1 iszero tag_1 jumpi 0x00 dup1 revert tag_1: pop jumpi(tag_2, lt(calldatasize, 0x04)) shr(0xe0, calldataload(0x00)) dup1 0x671ef26c eq tag_3 jumpi dup1 0x95c5fc03 eq tag_4 jumpi tag_2: 0x00 dup1 revert /* "test-ts/contracts/ERC20.sol":490:620 function transferFromProxy(uint256 amount) external {... */ tag_3: tag_5 0x04 dup1 calldatasize sub dup2 add swap1 tag_6 swap2 swap1 tag_7 jump // in tag_6: tag_8 jump // in tag_5: stop /* "test-ts/contracts/ERC20.sol":365:484 function balanceOfProxy(address who) public view returns (uint256) {... */ tag_4: tag_9 0x04 dup1 calldatasize sub dup2 add swap1 tag_10 swap2 swap1 tag_11 jump // in tag_10: tag_12 jump // in tag_9: mload(0x40) tag_13 swap2 swap1 tag_14 jump // in tag_13: mload(0x40) dup1 swap2 sub swap1 return /* "test-ts/contracts/ERC20.sol":490:620 function transferFromProxy(uint256 amount) external {... */ tag_8: /* "test-ts/contracts/ERC20.sol":559:564 cennz */ 0x00 dup1 sload swap1 0x0100 exp swap1 div 0xffffffffffffffffffffffffffffffffffffffff and /* "test-ts/contracts/ERC20.sol":552:578 IERC20(cennz).transferFrom */ 0xffffffffffffffffffffffffffffffffffffffff and 0x23b872dd /* "test-ts/contracts/ERC20.sol":579:589 msg.sender */ caller /* "test-ts/contracts/ERC20.sol":599:603 this */ address /* "test-ts/contracts/ERC20.sol":606:612 amount */ dup5 /* "test-ts/contracts/ERC20.sol":552:613 IERC20(cennz).transferFrom(msg.sender, address(this), amount) */ mload(0x40) dup5 0xffffffff and 0xe0 shl dup2 mstore 0x04 add tag_16 swap4 swap3 swap2 swap1 tag_17 jump // in tag_16: 0x00 mload(0x40) dup1 dup4 sub dup2 0x00 dup8 dup1 extcodesize iszero dup1 iszero tag_18 jumpi 0x00 dup1 revert tag_18: pop gas call iszero dup1 iszero tag_20 jumpi returndatasize 0x00 dup1 returndatacopy revert(0x00, returndatasize) tag_20: pop pop pop pop /* "test-ts/contracts/ERC20.sol":490:620 function transferFromProxy(uint256 amount) external {... */ pop jump // out /* "test-ts/contracts/ERC20.sol":365:484 function balanceOfProxy(address who) public view returns (uint256) {... */ tag_12: /* "test-ts/contracts/ERC20.sol":423:430 uint256 */ 0x00 /* "test-ts/contracts/ERC20.sol":456:461 cennz */ dup1 0x00 swap1 sload swap1 0x0100 exp swap1 div 0xffffffffffffffffffffffffffffffffffffffff and /* "test-ts/contracts/ERC20.sol":449:472 IERC20(cennz).balanceOf */ 0xffffffffffffffffffffffffffffffffffffffff and 0x70a08231 /* "test-ts/contracts/ERC20.sol":473:476 who */ dup4 /* "test-ts/contracts/ERC20.sol":449:477 IERC20(cennz).balanceOf(who) */ mload(0x40) dup3 0xffffffff and 0xe0 shl dup2 mstore 0x04 add tag_22 swap2 swap1 tag_23 jump // in tag_22: 0x20 mload(0x40) dup1 dup4 sub dup2 dup7 gas staticcall iszero dup1 iszero tag_25 jumpi returndatasize 0x00 dup1 returndatacopy revert(0x00, returndatasize) tag_25: pop pop pop pop mload(0x40) returndatasize not(0x1f) 0x1f dup3 add and dup3 add dup1 0x40 mstore pop dup2 add swap1 tag_26 swap2 swap1 tag_27 jump // in tag_26: /* "test-ts/contracts/ERC20.sol":442:477 return IERC20(cennz).balanceOf(who) */ swap1 pop /* "test-ts/contracts/ERC20.sol":365:484 function balanceOfProxy(address who) public view returns (uint256) {... */ swap2 swap1 pop jump // out /* "#utility.yul":88:205 */ tag_29: /* "#utility.yul":197:198 */ 0x00 /* "#utility.yul":194:195 */ dup1 /* "#utility.yul":187:199 */ revert /* "#utility.yul":334:411 */ tag_31: /* "#utility.yul":371:378 */ 0x00 /* "#utility.yul":400:405 */ dup2 /* "#utility.yul":389:405 */ swap1 pop /* "#utility.yul":334:411 */ swap2 swap1 pop jump // out /* "#utility.yul":417:539 */ tag_32: /* "#utility.yul":490:514 */ tag_47 /* "#utility.yul":508:513 */ dup2 /* "#utility.yul":490:514 */ tag_31 jump // in tag_47: /* "#utility.yul":483:488 */ dup2 /* "#utility.yul":480:515 */ eq /* "#utility.yul":470:533 */ tag_48 jumpi /* "#utility.yul":529:530 */ 0x00 /* "#utility.yul":526:527 */ dup1 /* "#utility.yul":519:531 */ revert /* "#utility.yul":470:533 */ tag_48: /* "#utility.yul":417:539 */ pop jump // out /* "#utility.yul":545:684 */ tag_33: /* "#utility.yul":591:596 */ 0x00 /* "#utility.yul":629:635 */ dup2 /* "#utility.yul":616:636 */ calldataload /* "#utility.yul":607:636 */ swap1 pop /* "#utility.yul":645:678 */ tag_50 /* "#utility.yul":672:677 */ dup2 /* "#utility.yul":645:678 */ tag_32 jump // in tag_50: /* "#utility.yul":545:684 */ swap3 swap2 pop pop jump // out /* "#utility.yul":690:1019 */ tag_7: /* "#utility.yul":749:755 */ 0x00 /* "#utility.yul":798:800 */ 0x20 /* "#utility.yul":786:795 */ dup3 /* "#utility.yul":777:784 */ dup5 /* "#utility.yul":773:796 */ sub /* "#utility.yul":769:801 */ slt /* "#utility.yul":766:885 */ iszero tag_52 jumpi /* "#utility.yul":804:883 */ tag_53 tag_29 jump // in tag_53: /* "#utility.yul":766:885 */ tag_52: /* "#utility.yul":924:925 */ 0x00 /* "#utility.yul":949:1002 */ tag_54 /* "#utility.yul":994:1001 */ dup5 /* "#utility.yul":985:991 */ dup3 /* "#utility.yul":974:983 */ dup6 /* "#utility.yul":970:992 */ add /* "#utility.yul":949:1002 */ tag_33 jump // in tag_54: /* "#utility.yul":939:1002 */ swap2 pop /* "#utility.yul":895:1012 */ pop /* "#utility.yul":690:1019 */ swap3 swap2 pop pop jump // out /* "#utility.yul":1025:1151 */ tag_34: /* "#utility.yul":1062:1069 */ 0x00 /* "#utility.yul":1102:1144 */ 0xffffffffffffffffffffffffffffffffffffffff /* "#utility.yul":1095:1100 */ dup3 /* "#utility.yul":1091:1145 */ and /* "#utility.yul":1080:1145 */ swap1 pop /* "#utility.yul":1025:1151 */ swap2 swap1 pop jump // out /* "#utility.yul":1157:1253 */ tag_35: /* "#utility.yul":1194:1201 */ 0x00 /* "#utility.yul":1223:1247 */ tag_57 /* "#utility.yul":1241:1246 */ dup3 /* "#utility.yul":1223:1247 */ tag_34 jump // in tag_57: /* "#utility.yul":1212:1247 */ swap1 pop /* "#utility.yul":1157:1253 */ swap2 swap1 pop jump // out /* "#utility.yul":1259:1381 */ tag_36: /* "#utility.yul":1332:1356 */ tag_59 /* "#utility.yul":1350:1355 */ dup2 /* "#utility.yul":1332:1356 */ tag_35 jump // in tag_59: /* "#utility.yul":1325:1330 */ dup2 /* "#utility.yul":1322:1357 */ eq /* "#utility.yul":1312:1375 */ tag_60 jumpi /* "#utility.yul":1371:1372 */ 0x00 /* "#utility.yul":1368:1369 */ dup1 /* "#utility.yul":1361:1373 */ revert /* "#utility.yul":1312:1375 */ tag_60: /* "#utility.yul":1259:1381 */ pop jump // out /* "#utility.yul":1387:1526 */ tag_37: /* "#utility.yul":1433:1438 */ 0x00 /* "#utility.yul":1471:1477 */ dup2 /* "#utility.yul":1458:1478 */ calldataload /* "#utility.yul":1449:1478 */ swap1 pop /* "#utility.yul":1487:1520 */ tag_62 /* "#utility.yul":1514:1519 */ dup2 /* "#utility.yul":1487:1520 */ tag_36 jump // in tag_62: /* "#utility.yul":1387:1526 */ swap3 swap2 pop pop jump // out /* "#utility.yul":1532:1861 */ tag_11: /* "#utility.yul":1591:1597 */ 0x00 /* "#utility.yul":1640:1642 */ 0x20 /* "#utility.yul":1628:1637 */ dup3 /* "#utility.yul":1619:1626 */ dup5 /* "#utility.yul":1615:1638 */ sub /* "#utility.yul":1611:1643 */ slt /* "#utility.yul":1608:1727 */ iszero tag_64 jumpi /* "#utility.yul":1646:1725 */ tag_65 tag_29 jump // in tag_65: /* "#utility.yul":1608:1727 */ tag_64: /* "#utility.yul":1766:1767 */ 0x00 /* "#utility.yul":1791:1844 */ tag_66 /* "#utility.yul":1836:1843 */ dup5 /* "#utility.yul":1827:1833 */ dup3 /* "#utility.yul":1816:1825 */ dup6 /* "#utility.yul":1812:1834 */ add /* "#utility.yul":1791:1844 */ tag_37 jump // in tag_66: /* "#utility.yul":1781:1844 */ swap2 pop /* "#utility.yul":1737:1854 */ pop /* "#utility.yul":1532:1861 */ swap3 swap2 pop pop jump // out /* "#utility.yul":1867:1985 */ tag_38: /* "#utility.yul":1954:1978 */ tag_68 /* "#utility.yul":1972:1977 */ dup2 /* "#utility.yul":1954:1978 */ tag_31 jump // in tag_68: /* "#utility.yul":1949:1952 */ dup3 /* "#utility.yul":1942:1979 */ mstore /* "#utility.yul":1867:1985 */ pop pop jump // out /* "#utility.yul":1991:2213 */ tag_14: /* "#utility.yul":2084:2088 */ 0x00 /* "#utility.yul":2122:2124 */ 0x20 /* "#utility.yul":2111:2120 */ dup3 /* "#utility.yul":2107:2125 */ add /* "#utility.yul":2099:2125 */ swap1 pop /* "#utility.yul":2135:2206 */ tag_70 /* "#utility.yul":2203:2204 */ 0x00 /* "#utility.yul":2192:2201 */ dup4 /* "#utility.yul":2188:2205 */ add /* "#utility.yul":2179:2185 */ dup5 /* "#utility.yul":2135:2206 */ tag_38 jump // in tag_70: /* "#utility.yul":1991:2213 */ swap3 swap2 pop pop jump // out /* "#utility.yul":2219:2337 */ tag_39: /* "#utility.yul":2306:2330 */ tag_72 /* "#utility.yul":2324:2329 */ dup2 /* "#utility.yul":2306:2330 */ tag_35 jump // in tag_72: /* "#utility.yul":2301:2304 */ dup3 /* "#utility.yul":2294:2331 */ mstore /* "#utility.yul":2219:2337 */ pop pop jump // out /* "#utility.yul":2343:2785 */ tag_17: /* "#utility.yul":2492:2496 */ 0x00 /* "#utility.yul":2530:2532 */ 0x60 /* "#utility.yul":2519:2528 */ dup3 /* "#utility.yul":2515:2533 */ add /* "#utility.yul":2507:2533 */ swap1 pop /* "#utility.yul":2543:2614 */ tag_74 /* "#utility.yul":2611:2612 */ 0x00 /* "#utility.yul":2600:2609 */ dup4 /* "#utility.yul":2596:2613 */ add /* "#utility.yul":2587:2593 */ dup7 /* "#utility.yul":2543:2614 */ tag_39 jump // in tag_74: /* "#utility.yul":2624:2696 */ tag_75 /* "#utility.yul":2692:2694 */ 0x20 /* "#utility.yul":2681:2690 */ dup4 /* "#utility.yul":2677:2695 */ add /* "#utility.yul":2668:2674 */ dup6 /* "#utility.yul":2624:2696 */ tag_39 jump // in tag_75: /* "#utility.yul":2706:2778 */ tag_76 /* "#utility.yul":2774:2776 */ 0x40 /* "#utility.yul":2763:2772 */ dup4 /* "#utility.yul":2759:2777 */ add /* "#utility.yul":2750:2756 */ dup5 /* "#utility.yul":2706:2778 */ tag_38 jump // in tag_76: /* "#utility.yul":2343:2785 */ swap5 swap4 pop pop pop pop jump // out /* "#utility.yul":2791:3013 */ tag_23: /* "#utility.yul":2884:2888 */ 0x00 /* "#utility.yul":2922:2924 */ 0x20 /* "#utility.yul":2911:2920 */ dup3 /* "#utility.yul":2907:2925 */ add /* "#utility.yul":2899:2925 */ swap1 pop /* "#utility.yul":2935:3006 */ tag_78 /* "#utility.yul":3003:3004 */ 0x00 /* "#utility.yul":2992:3001 */ dup4 /* "#utility.yul":2988:3005 */ add /* "#utility.yul":2979:2985 */ dup5 /* "#utility.yul":2935:3006 */ tag_39 jump // in tag_78: /* "#utility.yul":2791:3013 */ swap3 swap2 pop pop jump // out /* "#utility.yul":3019:3162 */ tag_40: /* "#utility.yul":3076:3081 */ 0x00 /* "#utility.yul":3107:3113 */ dup2 /* "#utility.yul":3101:3114 */ mload /* "#utility.yul":3092:3114 */ swap1 pop /* "#utility.yul":3123:3156 */ tag_80 /* "#utility.yul":3150:3155 */ dup2 /* "#utility.yul":3123:3156 */ tag_32 jump // in tag_80: /* "#utility.yul":3019:3162 */ swap3 swap2 pop pop jump // out /* "#utility.yul":3168:3519 */ tag_27: /* "#utility.yul":3238:3244 */ 0x00 /* "#utility.yul":3287:3289 */ 0x20 /* "#utility.yul":3275:3284 */ dup3 /* "#utility.yul":3266:3273 */ dup5 /* "#utility.yul":3262:3285 */ sub /* "#utility.yul":3258:3290 */ slt /* "#utility.yul":3255:3374 */ iszero tag_82 jumpi /* "#utility.yul":3293:3372 */ tag_83 tag_29 jump // in tag_83: /* "#utility.yul":3255:3374 */ tag_82: /* "#utility.yul":3413:3414 */ 0x00 /* "#utility.yul":3438:3502 */ tag_84 /* "#utility.yul":3494:3501 */ dup5 /* "#utility.yul":3485:3491 */ dup3 /* "#utility.yul":3474:3483 */ dup6 /* "#utility.yul":3470:3492 */ add /* "#utility.yul":3438:3502 */ tag_40 jump // in tag_84: /* "#utility.yul":3428:3502 */ swap2 pop /* "#utility.yul":3384:3512 */ pop /* "#utility.yul":3168:3519 */ swap3 swap2 pop pop jump // out auxdata: 0xa2646970667358221220926b02fcdc9a5b2e602324be771e1ebae7f55654d2717c9828e5c76db6ec544064736f6c63430008100033 } Binary: 608060405273cccccccc00003e800000000000000000000000006000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561006457600080fd5b506103b3806100746000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063671ef26c1461003b57806395c5fc0314610057575b600080fd5b610055600480360381019061005091906101f8565b610087565b005b610071600480360381019061006c9190610283565b610119565b60405161007e91906102bf565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016100e4939291906102e9565b600060405180830381600087803b1580156100fe57600080fd5b505af1158015610112573d6000803e3d6000fd5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016101759190610320565b602060405180830381865afa158015610192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101b69190610350565b9050919050565b600080fd5b6000819050919050565b6101d5816101c2565b81146101e057600080fd5b50565b6000813590506101f2816101cc565b92915050565b60006020828403121561020e5761020d6101bd565b5b600061021c848285016101e3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061025082610225565b9050919050565b61026081610245565b811461026b57600080fd5b50565b60008135905061027d81610257565b92915050565b600060208284031215610299576102986101bd565b5b60006102a78482850161026e565b91505092915050565b6102b9816101c2565b82525050565b60006020820190506102d460008301846102b0565b92915050565b6102e381610245565b82525050565b60006060820190506102fe60008301866102da565b61030b60208301856102da565b61031860408301846102b0565b949350505050565b600060208201905061033560008301846102da565b92915050565b60008151905061034a816101cc565b92915050565b600060208284031215610366576103656101bd565b5b60006103748482850161033b565b9150509291505056fea2646970667358221220926b02fcdc9a5b2e602324be771e1ebae7f55654d2717c9828e5c76db6ec544064736f6c63430008100033 ```