Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Different bytecode with same metadata on 0.6.12 #12281

Closed
NanezX opened this issue Nov 14, 2021 · 9 comments
Closed

Different bytecode with same metadata on 0.6.12 #12281

NanezX opened this issue Nov 14, 2021 · 9 comments
Assignees
Projects

Comments

@NanezX
Copy link

NanezX commented Nov 14, 2021

Description

Hi everyone, i already ask on the gitter and they told me that i can share the info here. I'm facing a really weird problem with the bytecode that i get from hardhat and I/O Json Descipttion. I created Input JSON Description files with solt to use them to verify in etherscan, but the bytecode that i got from these files it is different on several points along the bytecode. These contracts are using AbiEncodeV2, but doesn't happen with all the contracts so i don't think that is the problem. I know that solt use the sources names with a "realtive name" = './contract/A.sol' whi;le hardhat use "contract/A.sol". I already handle that and it is not the problem, because i'm getting the same metadahash at the end of the bytecode. And i'm using the same compiler setting in Solt files and hardhat.config

I compile from hardhat and deploy with their artifacts (that why i didnt use the plugin), so if the Input JSON doesn't compile the same bytecode, i will not be able to verify them. The only way to verify is using the exact "Input" inside the build-info folder that hardhat made, and just with this JSON i can verify all the contracts. But this is not the exactly what i need, because contain all the test contract that we use (and will show those test contracts as source in etherscan).

In short, i'm getting different bytecode compiled from a Input JSON with the solc --standard-json and the hardhat compiler. Both are using the same solitidty version: v0.6.12+commit.27d51765.
Also,

Environment

  • Compiler version: 0.6.12+commit.27d51765
  • Target EVM version (as per compiler settings): Istanbul
  • Framework/IDE (e.g. Truffle or Remix): Hardhat v2.6.5
  • EVM execution environment / backend / blockchain client: EVM execution environment
  • Operating system: Ubuntu 20.04LTS
  • Node version: v14.17.4

Steps to Reproduce

I already asked about to share the source as Input JSON, so i'll share ONE with the Input JSON created by hardhat, and others "individuals" Input JSON made it with solt (but the same settings). So, you should compile with solc 0.6.12, using the flag --standard-json and target a solc-input that i shared.

  • solc-input-hardhat is the Input JSON that i copied from hardhat, so will contain all the contracts source.
  • solc-input-trustfactory is an Input JSON with the main trust factory. The bytecode I got from here is different at some points from the one I got with hardhat and its JSON Input. The metadahash is the same
  • solc-input-trust is an input JSON with the source code of a Trust (created by the factory). The bytecode is different in some points. The metadahash is the same
  • solc-input-seederc20factory is an input with a Seed Factory. The bytecode that i got here is exactly the same between hardhat and solc cli compiler.
  • solc-seederc20 is an input with the source code of a Seed. Again the bytecode is EXACTLY the same, weird.

All the files will be inside the ZIP, and they have the same compiler setting. Ofc, we have more contracts as you will see in the solc-input-hardhat, but i will share these file until you need test more:
Input_JSON_Files.zip

Could it really be a bug? Should be work perfectly as far i know. Or i misunderstood something?

I really appreciate your time to read and help. :)

@chriseth
Copy link
Contributor

We should investigate why and how the code is different, but it might actually be that you did not check the correct metadata: The metadata is stored at the end of the deployed bytecode. If you only look at the compiled (constructor) bytecode itself, it might contain the bytecode of other contracts (contracts created with new) and thus also their metadata.

@cameel
Copy link
Member

cameel commented Nov 16, 2021

I checked this and this is our old problem with extra files added to the compilation affecting IDs in the bytecode. In this case it's that an extra contact results in different immutable IDs. It's still reproducible on 0.8.10.

Metadata is the same because apparently only the files used to compile the contract are included in metadata but CompilerStack probably still contains all the contracts.

I think we want to make immutable IDs stable like we did for AST IDs in #10342.

Repro

one.json

{
    "language": "Solidity",
    "sources": {
        "T.sol": { "content": "contract T { uint public immutable x = 0; }"}
    },
    "settings": {
        "outputSelection": {
            "*": {"*": ["evm.assembly", "metadata"]}
        }
    }
}

two.json

{
    "language": "Solidity",
    "sources": {
        "T.sol": { "content": "contract T { uint public immutable x = 0; }"},
        "D.sol": {"content": "abstract contract D {}"}
    },
    "settings": {
        "outputSelection": {
            "*": {"*": ["evm.assembly", "metadata"]}
        }
    }
}

Assembly diff

diff --color --unified \
    <(cat one.json | solc --standard-json | jq --raw-output '.contracts."T.sol".T.evm.assembly') \
    <(cat two.json | solc --standard-json | jq --raw-output '.contracts."T.sol".T.evm.assembly')
@@ -22,7 +22,7 @@
   mload(0x80)
   codecopy(0x00, dataOffset(sub_0), dataSize(sub_0))
   0x00
-  assignImmutable("0xceebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1")
+  assignImmutable("0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de")
   return(0x00, dataSize(sub_0))
 stop

@@ -70,7 +70,7 @@
       swap1
       return
     tag_5:
-      immutable("0xceebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1")
+      immutable("0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de")
       dup2
       jump     // out
         /* "#utility.yul":7:84   */

Metadata diff

diff --color --unified \
    <(cat one.json | solc --standard-json | jq --raw-output '.contracts."T.sol".T.metadata') \
    <(cat two.json | solc --standard-json | jq --raw-output '.contracts."T.sol".T.metadata')
  • No differences here

@chriseth
Copy link
Contributor

But does this also result in actual different bytecode, and not just in different assembly code?

@cameel
Copy link
Member

cameel commented Nov 16, 2021

Good point. In this particular repro bytecode is identical but in the original code there are some differences.

I tried to track it down by trimming the contracts but I got to a point where I still have a lot of files with many imports and pretty much any substantial change makes the difference go away. Unfortunately it's still ~30 contracts so it's not much better than the original input.

The bottom line is that this only affects 0.6.12 and 0.7.0 with optimizer enabled but on later versions the only differences are due to immutables so bytecode is identical.

Details

What I figured out so far:

  • It happens only on 0.6.12 and 0.7.0 (after adjusting conversions and constructor visibility to make it compile with latest compiler). 0.8.10 only has differences from immutables. I haven't checked anything before 0.6.12 because of syntax differences.
  • It only happens with the optimizer is enabled. EVM version and optimizer-runs do not affect it.
  • It's triggered by including an extra file in the compilation.
  • The differences aren't big but the code is not just moved around. It actually contains slightly different instructions (see diffs below).

Diffs from the trimmed code

Here's the assembly diff on the trimmed code I got so far:

@@ -162,8 +162,28 @@
       pop
       pop
       jump     // out
-        /* "--CODEGEN--":532:684   */
+        /* "--CODEGEN--":363:525   */
     tag_17:
+        /* "--CODEGEN--":455:468   */
+      dup1
+      mload
+      sub(shl(0xa0, 0x01), 0x01)
+        /* "--CODEGEN--":5226:5280   */
+      dup2
+      and
+        /* "--CODEGEN--":5721:5770   */
+      dup2
+      eq
+        /* "--CODEGEN--":5711:5713   */
+      tag_10
+      jumpi
+        /* "--CODEGEN--":5784:5785   */
+      0x00
+      dup1
+        /* "--CODEGEN--":5774:5786   */
+      revert
+        /* "--CODEGEN--":532:684   */
+    tag_20:
         /* "--CODEGEN--":619:632   */
       dup1
       mload
@@ -181,7 +201,7 @@
         /* "--CODEGEN--":5884:5896   */
       revert
         /* "--CODEGEN--":692:1136   */
-    tag_20:
+    tag_23:
       0x00
         /* "--CODEGEN--":805:808   */
       dup3
@@ -194,14 +214,14 @@
         /* "--CODEGEN--":782:809   */
       slt
         /* "--CODEGEN--":772:774   */
-      tag_22
+      tag_25
       jumpi
       dup1
       dup2
         /* "--CODEGEN--":813:825   */
       revert
         /* "--CODEGEN--":772:774   */
-    tag_22:
+    tag_25:
         /* "--CODEGEN--":853:859   */
       dup2
         /* "--CODEGEN--":847:860   */
@@ -214,18 +234,18 @@
       gt
         /* "--CODEGEN--":4755:4757   */
       iszero
-      tag_23
+      tag_26
       jumpi
       dup2
       dup3
         /* "--CODEGEN--":4791:4803   */
       revert
         /* "--CODEGEN--":4755:4757   */
-    tag_23:
+    tag_26:
         /* "--CODEGEN--":4932:4936   */
       0x20
         /* "--CODEGEN--":875:940   */
-      tag_24
+      tag_27
         /* "--CODEGEN--":4864:4873   */
       0x1f
         /* "--CODEGEN--":4845:4862   */
@@ -238,9 +258,9 @@
       dup3
       add
         /* "--CODEGEN--":875:940   */
-      tag_25
+      tag_28
       jump     // in
-    tag_24:
+    tag_27:
         /* "--CODEGEN--":866:940   */
       swap3
       pop
@@ -265,7 +285,7 @@
       gt
         /* "--CODEGEN--":1040:1042   */
       iszero
-      tag_26
+      tag_29
       jumpi
         /* "--CODEGEN--":1081:1082   */
       0x00
@@ -273,11 +293,11 @@
         /* "--CODEGEN--":1071:1083   */
       revert
         /* "--CODEGEN--":1040:1042   */
-    tag_26:
+    tag_29:
         /* "--CODEGEN--":5437:5438   */
       0x00
         /* "--CODEGEN--":5444:5545   */
-    tag_27:
+    tag_30:
         /* "--CODEGEN--":5458:5464   */
       dup3
         /* "--CODEGEN--":5455:5456   */
@@ -286,7 +306,7 @@
       lt
         /* "--CODEGEN--":5444:5545   */
       iszero
-      tag_29
+      tag_32
       jumpi
         /* "--CODEGEN--":5525:5536   */
       dup5
@@ -308,8 +328,8 @@
       dup2
       add
         /* "--CODEGEN--":5444:5545   */
-      jump(tag_27)
-    tag_29:
+      jump(tag_30)
+    tag_32:
         /* "--CODEGEN--":5560:5566   */
       dup3
         /* "--CODEGEN--":5557:5558   */
@@ -318,7 +338,7 @@
       gt
         /* "--CODEGEN--":5551:5553   */
       iszero
-      tag_30
+      tag_33
       jumpi
         /* "--CODEGEN--":5437:5438   */
       0x00
@@ -334,7 +354,7 @@
         /* "--CODEGEN--":5600:5627   */
       mstore
         /* "--CODEGEN--":5551:5553   */
-    tag_30:
+    tag_33:
       pop
       pop
       pop
@@ -360,14 +380,14 @@
       slt
         /* "--CODEGEN--":3053:3055   */
       iszero
-      tag_32
+      tag_35
       jumpi
       dup2
       dup3
         /* "--CODEGEN--":3091:3103   */
       revert
         /* "--CODEGEN--":3053:3055   */
-    tag_32:
+    tag_35:
         /* "--CODEGEN--":3149:3166   */
       dup3
         /* "--CODEGEN--":3136:3167   */
@@ -381,14 +401,14 @@
       gt
         /* "--CODEGEN--":3173:3175   */
       iszero
-      tag_33
+      tag_36
       jumpi
       dup4
       dup5
         /* "--CODEGEN--":3209:3221   */
       revert
         /* "--CODEGEN--":3173:3175   */
-    tag_33:
+    tag_36:
         /* "--CODEGEN--":3294:3300   */
       dup2
         /* "--CODEGEN--":3283:3292   */
@@ -408,14 +428,14 @@
         /* "--CODEGEN--":110:137   */
       slt
         /* "--CODEGEN--":100:102   */
-      tag_34
+      tag_37
       jumpi
       dup4
       dup5
         /* "--CODEGEN--":141:153   */
       revert
         /* "--CODEGEN--":100:102   */
-    tag_34:
+    tag_37:
         /* "--CODEGEN--":184:190   */
       dup2
         /* "--CODEGEN--":171:191   */
@@ -428,14 +448,14 @@
       gt
         /* "--CODEGEN--":197:199   */
       iszero
-      tag_35
+      tag_38
       jumpi
       dup5
       dup6
         /* "--CODEGEN--":233:245   */
       revert
         /* "--CODEGEN--":197:199   */
-    tag_35:
+    tag_38:
         /* "--CODEGEN--":328:331   */
       dup7
         /* "--CODEGEN--":3085:3087   */
@@ -451,14 +471,14 @@
       gt
         /* "--CODEGEN--":288:290   */
       iszero
-      tag_36
+      tag_39
       jumpi
       dup5
       dup6
         /* "--CODEGEN--":335:347   */
       revert
         /* "--CODEGEN--":288:290   */
-    tag_36:
+    tag_39:
         /* "--CODEGEN--":3085:3087   */
       0x20
         /* "--CODEGEN--":265:282   */
@@ -497,14 +517,14 @@
       slt
         /* "--CODEGEN--":3531:3533   */
       iszero
-      tag_38
+      tag_41
       jumpi
       dup3
       dup4
         /* "--CODEGEN--":3569:3581   */
       revert
         /* "--CODEGEN--":3531:3533   */
-    tag_38:
+    tag_41:
         /* "--CODEGEN--":1322:1326   */
       0x20
         /* "--CODEGEN--":1301:1320   */
@@ -513,23 +533,23 @@
       slt
         /* "--CODEGEN--":1294:1296   */
       iszero
-      tag_39
+      tag_42
       jumpi
       dup3
       dup4
         /* "--CODEGEN--":1330:1342   */
       revert
         /* "--CODEGEN--":1294:1296   */
-    tag_39:
+    tag_42:
       pop
         /* "--CODEGEN--":1358:1378   */
-      tag_40
+      tag_43
         /* "--CODEGEN--":1322:1326   */
       0x20
         /* "--CODEGEN--":1358:1378   */
-      tag_25
+      tag_28
       jump     // in
-    tag_40:
+    tag_43:
         /* "--CODEGEN--":2899:2912   */
       dup4
       mload
@@ -555,14 +575,14 @@
       gt
         /* "--CODEGEN--":3804:3806   */
       iszero
-      tag_41
+      tag_44
       jumpi
       dup3
       dup4
         /* "--CODEGEN--":3840:3852   */
       revert
         /* "--CODEGEN--":3804:3806   */
-    tag_41:
+    tag_44:
         /* "--CODEGEN--":3958:3980   */
       swap1
       dup5
@@ -578,22 +598,22 @@
       slt
         /* "--CODEGEN--":1726:1728   */
       iszero
-      tag_42
+      tag_45
       jumpi
       dup3
       dup4
         /* "--CODEGEN--":1762:1774   */
       revert
         /* "--CODEGEN--":1726:1728   */
-    tag_42:
+    tag_45:
         /* "--CODEGEN--":1790:1810   */
-      tag_43
+      tag_46
         /* "--CODEGEN--":1754:1758   */
       0xa0
         /* "--CODEGEN--":1790:1810   */
-      tag_25
+      tag_28
       jump     // in
-    tag_43:
+    tag_46:
         /* "--CODEGEN--":1866:1883   */
       dup3
         /* "--CODEGEN--":1860:1884   */
@@ -606,16 +626,16 @@
       gt
         /* "--CODEGEN--":1890:1892   */
       iszero
-      tag_44
+      tag_47
       jumpi
       dup5
       dup6
         /* "--CODEGEN--":1926:1938   */
       revert
         /* "--CODEGEN--":1890:1892   */
-    tag_44:
+    tag_47:
         /* "--CODEGEN--":1971:2041   */
-      tag_45
+      tag_48
         /* "--CODEGEN--":2037:2040   */
       dup9
         /* "--CODEGEN--":2028:2034   */
@@ -625,9 +645,9 @@
         /* "--CODEGEN--":2013:2035   */
       add
         /* "--CODEGEN--":1971:2041   */
-      tag_20
+      tag_23
       jump     // in
-    tag_45:
+    tag_48:
         /* "--CODEGEN--":1953:1969   */
       dup3
         /* "--CODEGEN--":1946:2042   */
@@ -649,16 +669,16 @@
       gt
         /* "--CODEGEN--":2136:2138   */
       iszero
-      tag_46
+      tag_49
       jumpi
       dup5
       dup6
         /* "--CODEGEN--":2172:2184   */
       revert
         /* "--CODEGEN--":2136:2138   */
-    tag_46:
+    tag_49:
         /* "--CODEGEN--":2217:2287   */
-      tag_47
+      tag_50
         /* "--CODEGEN--":2283:2286   */
       dup9
         /* "--CODEGEN--":2274:2280   */
@@ -668,9 +688,9 @@
         /* "--CODEGEN--":2259:2281   */
       add
         /* "--CODEGEN--":2217:2287   */
-      tag_20
+      tag_23
       jump     // in
-    tag_47:
+    tag_50:
         /* "--CODEGEN--":1322:1326   */
       0x20
         /* "--CODEGEN--":2203:2208   */
@@ -680,27 +700,20 @@
         /* "--CODEGEN--":2192:2288   */
       mstore
       pop
+        /* "--CODEGEN--":2382:2456   */
+      tag_51
+        /* "--CODEGEN--":2452:2455   */
+      dup8
         /* "--CODEGEN--":3563:3565   */
       0x40
         /* "--CODEGEN--":2432:2441   */
-      dup4
+      dup6
         /* "--CODEGEN--":2428:2450   */
       add
-        /* "--CODEGEN--":455:468   */
-      mload
-        /* "--CODEGEN--":446:468   */
-      swap2
-      pop
-        /* "--CODEGEN--":473:520   */
-      tag_48
-        /* "--CODEGEN--":514:519   */
-      dup3
-        /* "--CODEGEN--":473:520   */
-      tag_49
-      jump     // in
-    tag_48:
         /* "--CODEGEN--":2382:2456   */
-      dup2
+      tag_17
+      jump     // in
+    tag_51:
         /* "--CODEGEN--":3563:3565   */
       0x40
         /* "--CODEGEN--":2368:2373   */
@@ -710,7 +723,7 @@
         /* "--CODEGEN--":2357:2457   */
       mstore
         /* "--CODEGEN--":2560:2629   */
-      tag_50
+      tag_52
         /* "--CODEGEN--":2625:2628   */
       dup8
         /* "--CODEGEN--":2527:2529   */
@@ -720,9 +733,9 @@
         /* "--CODEGEN--":2601:2623   */
       add
         /* "--CODEGEN--":2560:2629   */
-      tag_17
+      tag_20
       jump     // in
-    tag_50:
+    tag_52:
         /* "--CODEGEN--":2527:2529   */
       0x60
         /* "--CODEGEN--":2546:2551   */
@@ -780,7 +793,7 @@
         /* "--CODEGEN--":4231:4355   */
       jump     // out
         /* "--CODEGEN--":4362:4618   */
-    tag_25:
+    tag_28:
         /* "--CODEGEN--":4424:4426   */
       0x40
         /* "--CODEGEN--":4418:4427   */
@@ -802,7 +815,7 @@
       or
         /* "--CODEGEN--":4504:4506   */
       iszero
-      tag_53
+      tag_55
       jumpi
         /* "--CODEGEN--":4582:4583   */
       0x00
@@ -810,7 +823,7 @@
         /* "--CODEGEN--":4572:4584   */
       revert
         /* "--CODEGEN--":4504:4506   */
-    tag_53:
+    tag_55:
         /* "--CODEGEN--":4424:4426   */
       0x40
         /* "--CODEGEN--":4591:4613   */
@@ -820,28 +833,6 @@
       swap1
       pop
       jump     // out
-        /* "--CODEGEN--":5648:5793   */
-    tag_49:
-      sub(shl(0xa0, 0x01), 0x01)
-        /* "--CODEGEN--":5226:5280   */
-      dup2
-      and
-        /* "--CODEGEN--":5721:5770   */
-      dup2
-      eq
-        /* "--CODEGEN--":5711:5713   */
-      tag_55
-      jumpi
-        /* "--CODEGEN--":5784:5785   */
-      0x00
-      dup1
-        /* "--CODEGEN--":5774:5786   */
-      revert
-        /* "--CODEGEN--":5711:5713   */
-    tag_55:
-        /* "--CODEGEN--":5705:5793   */
-      pop
-      jump     // out

     auxdata: 0xa2646970667358221220442e524eef4cfc63045cdc6f01e3c761af72190d26db1d83651418414a2cf4f264736f6c63430007000033
 }

When I take only changed lines, sort them and diff them again, you can see that there are some opcodes that are present in one output but not the other (and vice-versa):

+      dup1
-      dup2
-      dup3
-      dup4
+      dup6
+      dup8
-      jump     // out
-      jump(tag_27)
+      jump(tag_30)
-      pop
-      pop
-      swap2

I removed comments and tags from the above.

Diffs from the original code

Here's the same thing for input close to the original (i.e. solc-input-hardhat vs solc-input-trustfactory, just with changed pragmas, removed newline before EOF from some files, outputs in JSON and removed and all files extra except ReadOnlyTier.sol removed from solc-input-hardhat).

@@ -223,9 +223,9 @@
   shr(0x60, mload(0xa0))
   shr(0x60, mload(0xc0))
   codecopy(0x00, dataOffset(sub_0), dataSize(sub_0))
-  assignImmutable("0x9614ae301e7f223b810db97ca1e18bc99c9bdd404706f21716e8bde641f373de")
-  assignImmutable("0xa52d0fc2be1b30cecbfd48ac7bbe7bd89fc6771a975e7ed6d98b2a3fcb3379d7")
-  assignImmutable("0xd761dd6fd26575166d5033b2f6b9017238b0b3abedddcb668d87fe8e20aa596f")
+  assignImmutable("0x54af41c9f5823f54786f556579785c27b181dbfb642c127d49aceae24a6ea03c")
+  assignImmutable("0x2dff5dacd0a2ed73b7d16efcb23d053715f5609f1b7982f3292410666d935944")
+  assignImmutable("0x33695bc4fb95c11dfe476c2e4814a5e7e43e17ac103938c5744f07e27a112b49")
   return(0x00, dataSize(sub_0))
 stop
 
@@ -478,17 +478,17 @@
       jump     // out
         /* "contracts/rain-protocol/contracts/trust/TrustFactory.sol":6746:6796  SeedERC20Factory public immutable seedERC20Factory */
     tag_17:
-      immutable("0x9614ae301e7f223b810db97ca1e18bc99c9bdd404706f21716e8bde641f373de")
+      immutable("0x54af41c9f5823f54786f556579785c27b181dbfb642c127d49aceae24a6ea03c")
       dup2
       jump     // out
         /* "contracts/rain-protocol/contracts/trust/TrustFactory.sol":6602:6664  RedeemableERC20Factory public immutable redeemableERC20Factory */
     tag_21:
-      immutable("0xd761dd6fd26575166d5033b2f6b9017238b0b3abedddcb668d87fe8e20aa596f")
+      immutable("0x33695bc4fb95c11dfe476c2e4814a5e7e43e17ac103938c5744f07e27a112b49")
       dup2
       jump     // out
         /* "contracts/rain-protocol/contracts/trust/TrustFactory.sol":6670:6740  RedeemableERC20PoolFactory public immutable redeemableERC20PoolFactory */
     tag_25:
-      immutable("0xa52d0fc2be1b30cecbfd48ac7bbe7bd89fc6771a975e7ed6d98b2a3fcb3379d7")
+      immutable("0x2dff5dacd0a2ed73b7d16efcb23d053715f5609f1b7982f3292410666d935944")
       dup2
       jump     // out
         /* "contracts/rain-protocol/contracts/factory/Factory.sol":1727:2196  function createChild(bytes calldata data_)... */
@@ -698,7 +698,7 @@
       0x20
       add
         /* "contracts/rain-protocol/contracts/trust/TrustFactory.sol":9249:9265  seedERC20Factory */
-      immutable("0x9614ae301e7f223b810db97ca1e18bc99c9bdd404706f21716e8bde641f373de")
+      immutable("0x54af41c9f5823f54786f556579785c27b181dbfb642c127d49aceae24a6ea03c")
         /* "contracts/rain-protocol/contracts/trust/TrustFactory.sol":9108:9552  TrustConfig(... */
       0xffffffffffffffffffffffffffffffffffffffff
       and
@@ -775,7 +775,7 @@
       mstore
       dup1
         /* "contracts/rain-protocol/contracts/trust/TrustFactory.sol":9610:9632  redeemableERC20Factory */
-      immutable("0xd761dd6fd26575166d5033b2f6b9017238b0b3abedddcb668d87fe8e20aa596f")
+      immutable("0x33695bc4fb95c11dfe476c2e4814a5e7e43e17ac103938c5744f07e27a112b49")
         /* "contracts/rain-protocol/contracts/trust/TrustFactory.sol":9566:9974  TrustRedeemableERC20Config(... */
       0xffffffffffffffffffffffffffffffffffffffff
       and
@@ -856,7 +856,7 @@
       mstore
       dup1
         /* "contracts/rain-protocol/contracts/trust/TrustFactory.sol":10036:10062  redeemableERC20PoolFactory */
-      immutable("0xa52d0fc2be1b30cecbfd48ac7bbe7bd89fc6771a975e7ed6d98b2a3fcb3379d7")
+      immutable("0x2dff5dacd0a2ed73b7d16efcb23d053715f5609f1b7982f3292410666d935944")
         /* "contracts/rain-protocol/contracts/trust/TrustFactory.sol":9988:10477  TrustRedeemableERC20PoolConfig(... */
       0xffffffffffffffffffffffffffffffffffffffff
       and
@@ -2010,68 +2010,71 @@
       tag_86
       jump     // in
     tag_130:
-        /* "--CODEGEN--":85:91   */
-      dup5
-        /* "--CODEGEN--":72:92   */
-      calldataload
-        /* "--CODEGEN--":97:130   */
+        /* "--CODEGEN--":2108:2157   */
       tag_131
-        /* "--CODEGEN--":124:129   */
-      dup2
-        /* "--CODEGEN--":97:130   */
-      tag_77
+        /* "--CODEGEN--":2153:2156   */
+      dup7
+        /* "--CODEGEN--":2129:2151   */
+      dup7
+        /* "--CODEGEN--":2108:2157   */
+      tag_74
       jump     // in
     tag_131:
-        /* "--CODEGEN--":2083:2158   */
+        /* "--CODEGEN--":2090:2106   */
       dup2
+        /* "--CODEGEN--":2083:2158   */
       mstore
         /* "--CODEGEN--":2234:2236   */
       0x20
-        /* "--CODEGEN--":2288:2310   */
+        /* "--CODEGEN--":2292:2301   */
       dup6
-      dup2
+        /* "--CODEGEN--":2288:2310   */
       add
         /* "--CODEGEN--":6102:6122   */
       calldataload
-        /* "--CODEGEN--":2249:2265   */
-      swap1
+        /* "--CODEGEN--":2234:2236   */
+      0x20
+        /* "--CODEGEN--":2253:2258   */
       dup3
+        /* "--CODEGEN--":2249:2265   */
       add
         /* "--CODEGEN--":2242:2317   */
       mstore
+        /* "--CODEGEN--":2413:2462   */
+      tag_132
+        /* "--CODEGEN--":2458:2461   */
+      dup7
         /* "--CODEGEN--":2380:2382   */
       0x40
+        /* "--CODEGEN--":2438:2447   */
+      dup8
         /* "--CODEGEN--":2434:2456   */
-      dup6
       add
-        /* "--CODEGEN--":72:92   */
-      calldataload
-        /* "--CODEGEN--":97:130   */
-      tag_132
-        /* "--CODEGEN--":72:92   */
-      dup2
-        /* "--CODEGEN--":97:130   */
-      tag_77
+        /* "--CODEGEN--":2413:2462   */
+      tag_74
       jump     // in
     tag_132:
         /* "--CODEGEN--":2380:2382   */
       0x40
-        /* "--CODEGEN--":2395:2411   */
+        /* "--CODEGEN--":2399:2404   */
       dup3
+        /* "--CODEGEN--":2395:2411   */
       add
         /* "--CODEGEN--":2388:2463   */
       mstore
         /* "--CODEGEN--":2529:2531   */
       0x60
-        /* "--CODEGEN--":2583:2605   */
+        /* "--CODEGEN--":2587:2596   */
       dup6
-      dup2
+        /* "--CODEGEN--":2583:2605   */
       add
         /* "--CODEGEN--":6102:6122   */
       calldataload
-        /* "--CODEGEN--":2544:2560   */
-      swap1
+        /* "--CODEGEN--":2529:2531   */
+      0x60
+        /* "--CODEGEN--":2548:2553   */
       dup3
+        /* "--CODEGEN--":2544:2560   */
       add
         /* "--CODEGEN--":2537:2612   */
       mstore
@@ -2081,8 +2084,9 @@
       dup7
         /* "--CODEGEN--":2680:2683   */
       0x80
-        /* "--CODEGEN--":2734:2756   */
+        /* "--CODEGEN--":2738:2747   */
       dup8
+        /* "--CODEGEN--":2734:2756   */
       add
         /* "--CODEGEN--":2714:2762   */
       tag_106
@@ -2410,9 +2414,8 @@
       add
         /* "--CODEGEN--":21173:21210   */
       mstore
-        /* "--CODEGEN--":17687:17691   */
+        /* "--CODEGEN--":28081:28093   */
       0x40
-        /* "--CODEGEN--":17676:17692   */
       dup1
       dup3
       add
@@ -2424,9 +2427,8 @@
       add
         /* "--CODEGEN--":21173:21210   */
       mstore
-        /* "--CODEGEN--":17878:17882   */
+        /* "--CODEGEN--":28081:28093   */
       0x60
-        /* "--CODEGEN--":17867:17883   */
       dup1
       dup3
       add
@@ -2438,9 +2440,8 @@
       add
         /* "--CODEGEN--":21173:21210   */
       mstore
-        /* "--CODEGEN--":18077:18081   */
+        /* "--CODEGEN--":28081:28093   */
       0x80
-        /* "--CODEGEN--":18066:18082   */
       swap1
       dup2
       add
@@ -2830,22 +2831,23 @@
       0x00
         /* "--CODEGEN--":23698:23701   */
       0x01e0
-        /* "--CODEGEN--":12425:12488   */
-      tag_172
-        /* "--CODEGEN--":12473:12487   */
-      dup4
+        /* "--CODEGEN--":28818:28860   */
+      0xffffffffffffffffffffffffffffffffffffffff
+      dup1
         /* "--CODEGEN--":12402:12418   */
       dup8
         /* "--CODEGEN--":12396:12419   */
       mload
-        /* "--CODEGEN--":12425:12488   */
-      tag_138
-      jump     // in
-    tag_172:
+        /* "--CODEGEN--":28807:28861   */
+      and
+        /* "--CODEGEN--":8944:8947   */
+      dup5
+        /* "--CODEGEN--":8937:8974   */
+      mstore
         /* "--CODEGEN--":12582:12586   */
       0x20
         /* "--CODEGEN--":12575:12580   */
-      dup7
+      dup8
         /* "--CODEGEN--":12571:12587   */
       add
         /* "--CODEGEN--":12565:12588   */
@@ -2853,33 +2855,31 @@
         /* "--CODEGEN--":12582:12586   */
       0x20
         /* "--CODEGEN--":12646:12649   */
-      dup5
+      dup6
         /* "--CODEGEN--":12642:12656   */
       add
         /* "--CODEGEN--":21173:21210   */
       mstore
+        /* "--CODEGEN--":28818:28860   */
+      dup1
         /* "--CODEGEN--":12748:12752   */
       0x40
         /* "--CODEGEN--":12741:12746   */
-      dup7
+      dup9
         /* "--CODEGEN--":12737:12753   */
       add
         /* "--CODEGEN--":12731:12754   */
       mload
-        /* "--CODEGEN--":12760:12848   */
-      tag_173
+        /* "--CODEGEN--":28807:28861   */
+      and
         /* "--CODEGEN--":12748:12752   */
       0x40
         /* "--CODEGEN--":12837:12840   */
       dup6
         /* "--CODEGEN--":12833:12847   */
       add
-        /* "--CODEGEN--":12819:12831   */
-      dup3
-        /* "--CODEGEN--":12760:12848   */
-      tag_138
-      jump     // in
-    tag_173:
+        /* "--CODEGEN--":9643:9708   */
+      mstore
       pop
         /* "--CODEGEN--":12929:12933   */
       0x60
@@ -2890,7 +2890,7 @@
         /* "--CODEGEN--":12912:12935   */
       mload
         /* "--CODEGEN--":12941:13004   */
-      tag_174
+      tag_172
         /* "--CODEGEN--":12929:12933   */
       0x60
         /* "--CODEGEN--":12993:12996   */
@@ -2902,7 +2902,7 @@
         /* "--CODEGEN--":12941:13004   */
       tag_138
       jump     // in
-    tag_174:
+    tag_172:
       pop
         /* "--CODEGEN--":13088:13092   */
       0x80
@@ -2929,7 +2929,7 @@
         /* "--CODEGEN--":13232:13255   */
       mload
         /* "--CODEGEN--":13261:13322   */
-      tag_175
+      tag_173
         /* "--CODEGEN--":13249:13253   */
       0xa0
         /* "--CODEGEN--":13311:13314   */
@@ -2941,7 +2941,7 @@
         /* "--CODEGEN--":13261:13322   */
       tag_161
       jump     // in
-    tag_175:
+    tag_173:
       pop
         /* "--CODEGEN--":13419:13423   */
       0xc0
@@ -2952,7 +2952,7 @@
         /* "--CODEGEN--":13402:13425   */
       mload
         /* "--CODEGEN--":13431:13492   */
-      tag_176
+      tag_174
         /* "--CODEGEN--":13419:13423   */
       0xc0
         /* "--CODEGEN--":13481:13484   */
@@ -2964,7 +2964,7 @@
         /* "--CODEGEN--":13431:13492   */
       tag_161
       jump     // in
-    tag_176:
+    tag_174:
       pop
         /* "--CODEGEN--":13577:13581   */
       0xe0
@@ -2993,7 +2993,7 @@
         /* "--CODEGEN--":23853:23902   */
       mstore
         /* "--CODEGEN--":23916:24062   */
-      tag_177
+      tag_175
         /* "--CODEGEN--":23698:23701   */
       dup2
         /* "--CODEGEN--":23687:23696   */
@@ -3005,7 +3005,7 @@
         /* "--CODEGEN--":23916:24062   */
       tag_154
       jump     // in
-    tag_177:
+    tag_175:
         /* "--CODEGEN--":23908:24062   */
       swap2
       pop
@@ -3035,11 +3035,11 @@
         /* "--CODEGEN--":26856:26868   */
       add
         /* "--CODEGEN--":14053:14116   */
-      tag_180
+      tag_178
         /* "--CODEGEN--":14101:14115   */
       dup5
         /* "--CODEGEN--":26830:26869   */
-      tag_181
+      tag_179
         /* "--CODEGEN--":26856:26868   */
       dup4
         /* "--CODEGEN--":14030:14046   */
@@ -3047,11 +3047,11 @@
         /* "--CODEGEN--":26830:26869   */
       tag_74
       jump     // in
-    tag_181:
+    tag_179:
         /* "--CODEGEN--":14053:14116   */
       tag_138
       jump     // in
-    tag_180:
+    tag_178:
         /* "--CODEGEN--":6102:6122   */
       calldataload
         /* "--CODEGEN--":26865:26867   */
@@ -3062,7 +3062,7 @@
         /* "--CODEGEN--":21173:21210   */
       mstore
         /* "--CODEGEN--":14376:14426   */
-      tag_182
+      tag_180
         /* "--CODEGEN--":14420:14424   */
       0x40
         /* "--CODEGEN--":14409:14425   */
@@ -3071,11 +3071,11 @@
         /* "--CODEGEN--":14413:14418   */
       dup8
         /* "--CODEGEN--":14376:14426   */
-      tag_183
+      tag_181
       jump     // in
-    tag_182:
+    tag_180:
         /* "--CODEGEN--":14432:14495   */
-      tag_184
+      tag_182
         /* "--CODEGEN--":14420:14424   */
       0x40
         /* "--CODEGEN--":14484:14487   */
@@ -3087,7 +3087,7 @@
         /* "--CODEGEN--":14432:14495   */
       tag_138
       jump     // in
-    tag_184:
+    tag_182:
       pop
         /* "--CODEGEN--":14606:14610   */
       0x60
@@ -3106,7 +3106,7 @@
         /* "--CODEGEN--":21173:21210   */
       mstore
         /* "--CODEGEN--":14750:14799   */
-      tag_185
+      tag_183
         /* "--CODEGEN--":14793:14797   */
       0x80
         /* "--CODEGEN--":14786:14791   */
@@ -3116,11 +3116,11 @@
         /* "--CODEGEN--":14775:14780   */
       dup8
         /* "--CODEGEN--":14750:14799   */
-      tag_186
+      tag_184
       jump     // in
-    tag_185:
+    tag_183:
         /* "--CODEGEN--":14805:14866   */
-      tag_187
+      tag_185
         /* "--CODEGEN--":14793:14797   */
       0x80
         /* "--CODEGEN--":14855:14858   */
@@ -3132,10 +3132,10 @@
         /* "--CODEGEN--":14805:14866   */
       tag_161
       jump     // in
-    tag_187:
+    tag_185:
       pop
         /* "--CODEGEN--":14946:14995   */
-      tag_188
+      tag_186
         /* "--CODEGEN--":14989:14993   */
       0xa0
         /* "--CODEGEN--":14982:14987   */
@@ -3145,11 +3145,11 @@
         /* "--CODEGEN--":14971:14976   */
       dup8
         /* "--CODEGEN--":14946:14995   */
-      tag_186
+      tag_184
       jump     // in
-    tag_188:
+    tag_186:
         /* "--CODEGEN--":15001:15062   */
-      tag_189
+      tag_187
         /* "--CODEGEN--":14989:14993   */
       0xa0
         /* "--CODEGEN--":15051:15054   */
@@ -3161,7 +3161,7 @@
         /* "--CODEGEN--":15001:15062   */
       tag_161
       jump     // in
-    tag_189:
+    tag_187:
       pop
         /* "--CODEGEN--":15174:15178   */
       0xc0
@@ -3190,15 +3190,15 @@
         /* "--CODEGEN--":24943:24992   */
       mstore
         /* "--CODEGEN--":15673:15735   */
-      tag_190
+      tag_188
         /* "--CODEGEN--":15718:15734   */
       dup6
         /* "--CODEGEN--":15711:15716   */
       dup7
         /* "--CODEGEN--":15673:15735   */
-      tag_191
+      tag_189
       jump     // in
-    tag_190:
+    tag_188:
         /* "--CODEGEN--":14989:14993   */
       0xa0
         /* "--CODEGEN--":24762:24765   */
@@ -3210,7 +3210,7 @@
         /* "--CODEGEN--":15748:15786   */
       mstore
         /* "--CODEGEN--":15801:15890   */
-      tag_192
+      tag_190
         /* "--CODEGEN--":15584:15598   */
       0x0240
         /* "--CODEGEN--":24751:24760   */
@@ -3224,14 +3224,14 @@
         /* "--CODEGEN--":15801:15890   */
       tag_149
       jump     // in
-    tag_192:
+    tag_190:
         /* "--CODEGEN--":15793:15890   */
       swap3
       pop
       pop
       pop
         /* "--CODEGEN--":15974:16036   */
-      tag_193
+      tag_191
         /* "--CODEGEN--":26865:26867   */
       0x20
         /* "--CODEGEN--":16023:16028   */
@@ -3241,9 +3241,9 @@
         /* "--CODEGEN--":16012:16017   */
       dup7
         /* "--CODEGEN--":15974:16036   */
-      tag_191
+      tag_189
       jump     // in
-    tag_193:
+    tag_191:
         /* "--CODEGEN--":16072:16086   */
       0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60
         /* "--CODEGEN--":24751:24760   */
@@ -3262,7 +3262,7 @@
         /* "--CODEGEN--":16049:16087   */
       mstore
         /* "--CODEGEN--":16102:16191   */
-      tag_194
+      tag_192
         /* "--CODEGEN--":16186:16190   */
       dup4
         /* "--CODEGEN--":16172:16184   */
@@ -3272,14 +3272,14 @@
         /* "--CODEGEN--":16102:16191   */
       tag_149
       jump     // in
-    tag_194:
+    tag_192:
         /* "--CODEGEN--":16094:16191   */
       swap3
       pop
       pop
       pop
         /* "--CODEGEN--":16259:16323   */
-      tag_195
+      tag_193
         /* "--CODEGEN--":14420:14424   */
       0x40
         /* "--CODEGEN--":16310:16315   */
@@ -3289,11 +3289,11 @@
         /* "--CODEGEN--":16299:16304   */
       dup7
         /* "--CODEGEN--":16259:16323   */
-      tag_183
+      tag_181
       jump     // in
-    tag_195:
+    tag_193:
         /* "--CODEGEN--":16329:16406   */
-      tag_196
+      tag_194
         /* "--CODEGEN--":16391:16405   */
       0x01e0
         /* "--CODEGEN--":24751:24760   */
@@ -3305,10 +3305,10 @@
         /* "--CODEGEN--":16329:16406   */
       tag_138
       jump     // in
-    tag_196:
+    tag_194:
       pop
         /* "--CODEGEN--":16477:16536   */
-      tag_197
+      tag_195
         /* "--CODEGEN--":14606:14610   */
       0x60
         /* "--CODEGEN--":16523:16528   */
@@ -3318,11 +3318,11 @@
         /* "--CODEGEN--":16512:16517   */
       dup7
         /* "--CODEGEN--":16477:16536   */
-      tag_198
+      tag_196
       jump     // in
-    tag_197:
+    tag_195:
         /* "--CODEGEN--":16542:16612   */
-      tag_199
+      tag_197
         /* "--CODEGEN--":16597:16611   */
       0x0200
         /* "--CODEGEN--":24751:24760   */
@@ -3334,7 +3334,7 @@
         /* "--CODEGEN--":16542:16612   */
       tag_146
       jump     // in
-    tag_199:
+    tag_197:
       pop
         /* "--CODEGEN--":14793:14797   */
       0x80
@@ -3387,7 +3387,7 @@
       or
         /* "--CODEGEN--":25543:25545   */
       iszero
-      tag_202
+      tag_200
       jumpi
         /* "--CODEGEN--":25621:25622   */
       0x00
@@ -3395,7 +3395,7 @@
         /* "--CODEGEN--":25611:25623   */
       revert
         /* "--CODEGEN--":25543:25545   */
-    tag_202:
+    tag_200:
         /* "--CODEGEN--":25463:25465   */
       0x40
         /* "--CODEGEN--":25630:25652   */
@@ -3406,7 +3406,7 @@
       pop
       jump     // out
         /* "--CODEGEN--":26756:26875   */
-    tag_183:
+    tag_181:
       0x00
         /* "--CODEGEN--":85:91   */
       dup3
@@ -3420,7 +3420,7 @@
       tag_77
       jump     // in
         /* "--CODEGEN--":27198:27335   */
-    tag_198:
+    tag_196:
       0x00
         /* "--CODEGEN--":27281:27329   */
       tag_111
@@ -3436,7 +3436,7 @@
       tag_78
       jump     // in
         /* "--CODEGEN--":27344:27846   */
-    tag_191:
+    tag_189:
       0x00
       dup1
         /* "--CODEGEN--":27469:27472   */
@@ -3458,14 +3458,14 @@
         /* "--CODEGEN--":27489:27562   */
       slt
         /* "--CODEGEN--":27479:27481   */
-      tag_208
+      tag_206
       jumpi
       dup3
       dup4
         /* "--CODEGEN--":27566:27578   */
       revert
         /* "--CODEGEN--":27479:27481   */
-    tag_208:
+    tag_206:
         /* "--CODEGEN--":27595:27628   */
       dup4
       add
@@ -3487,7 +3487,7 @@
       gt
         /* "--CODEGEN--":27706:27708   */
       iszero
-      tag_209
+      tag_207
       jumpi
         /* "--CODEGEN--":27752:27753   */
       0x00
@@ -3495,7 +3495,7 @@
         /* "--CODEGEN--":27742:27754   */
       revert
         /* "--CODEGEN--":27706:27708   */
-    tag_209:
+    tag_207:
         /* "--CODEGEN--":27799:27816   */
       dup1
         /* "--CODEGEN--":27521:27535   */
@@ -3508,7 +3508,7 @@
       sgt
         /* "--CODEGEN--":27762:27764   */
       iszero
-      tag_210
+      tag_208
       jumpi
         /* "--CODEGEN--":27831:27832   */
       0x00
@@ -3516,7 +3516,7 @@
         /* "--CODEGEN--":27821:27833   */
       revert
         /* "--CODEGEN--":27762:27764   */
-    tag_210:
+    tag_208:
         /* "--CODEGEN--":27423:27846   */
       swap3
       pop
@@ -3525,7 +3525,7 @@
       pop
       jump     // out
         /* "--CODEGEN--":27855:27972   */
-    tag_186:
+    tag_184:
       0x00
         /* "--CODEGEN--":5979:5985   */
       dup3
@@ -3561,7 +3561,7 @@
         /* "--CODEGEN--":31360:31395   */
       eq
         /* "--CODEGEN--":31350:31352   */
-      tag_214
+      tag_212
       jumpi
         /* "--CODEGEN--":31409:31410   */
       0x00
@@ -3569,7 +3569,7 @@
         /* "--CODEGEN--":31399:31411   */
       revert
         /* "--CODEGEN--":31350:31352   */
-    tag_214:
+    tag_212:
         /* "--CODEGEN--":31344:31418   */
       pop
       jump     // out
@@ -7211,33 +7211,32 @@
             /* "--CODEGEN--":2367:2398   */
           swap2
           pop
-            /* "--CODEGEN--":2483:2543   */
+            /* "--CODEGEN--":89:95   */
+          dup6
+            /* "--CODEGEN--":83:96   */
+          mload
+            /* "--CODEGEN--":101:134   */
           tag_244
-            /* "--CODEGEN--":2539:2542   */
-          dup8
-            /* "--CODEGEN--":2515:2537   */
-          dup8
-            /* "--CODEGEN--":2483:2543   */
-          tag_193
+            /* "--CODEGEN--":128:133   */
+          dup2
+            /* "--CODEGEN--":101:134   */
+          tag_196
           jump // in
         tag_244:
-            /* "--CODEGEN--":2465:2481   */
-          dup3
             /* "--CODEGEN--":2458:2544   */
+          dup3
           mstore
             /* "--CODEGEN--":2620:2622   */
           0x20
-            /* "--CODEGEN--":2689:2698   */
-          dup7
             /* "--CODEGEN--":2685:2707   */
+          dup7
+          dup2
           add
             /* "--CODEGEN--":6740:6753   */
           mload
-            /* "--CODEGEN--":2620:2622   */
-          0x20
-            /* "--CODEGEN--":2639:2644   */
-          dup4
             /* "--CODEGEN--":2635:2651   */
+          swap1
+          dup4
           add
             /* "--CODEGEN--":2628:2714   */
           mstore
@@ -7247,9 +7246,8 @@
           dup8
             /* "--CODEGEN--":2787:2789   */
           0x40
-            /* "--CODEGEN--":2881:2890   */
-          dup9
             /* "--CODEGEN--":2877:2899   */
+          dup9
           add
             /* "--CODEGEN--":2820:2905   */
           tag_193
@@ -8529,17 +8527,17 @@
           shr(0x60, mload(0x01a0))
           shr(0x60, mload(0x01c0))
           codecopy(0x00, dataOffset(sub_0), dataSize(sub_0))
-          assignImmutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
-          assignImmutable("0x35e0a5d0f5b0569d1093ec5fdf2f163fb06bd6f948370537b24e994190ee9404")
-          assignImmutable("0xfd8d1ed1a43deb872a1a5285e0b64e33422e96d48256d4125a105cc4da5a17c6")
-          assignImmutable("0x72e500f04d6bf463abe0ab49ce296c197824c4038654f3d4cdb3caf862ef634e")
-          assignImmutable("0xf5f368b36bc86e66fa8ba483eecfebd009cf8821c91db5504dc0cb8a9388235a")
-          assignImmutable("0xc6d20a6e2d6a6b10df8604da3588d27eb010ed1234c7e3e6f35825005532e4d1")
-          assignImmutable("0x8a03e496e719530e08b1c00044535339c35147888b0ea9b1d391b17bb162b341")
-          assignImmutable("0x1d02ededae9e217eb08394d0854445ae178adbcb8308b3e681eeeee1489ca4c3")
-          assignImmutable("0x4082b67cb7af061bf9cf67209517a9191c7bee596624d46eb91d334287a427fb")
-          assignImmutable("0x01dee97ea74b75520cf6a46629b466c311f956cbc18a95ae58c573f5867d87a8")
-          assignImmutable("0x26721cef89d6ca54ed4d654aa494650cf46e75d7e3e9eff3a266421b505fedd2")
+          assignImmutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
+          assignImmutable("0x6bff3f8d49e0bf21b445c8bc0d722f5d313e5fbbc155a2a488e033dca4472618")
+          assignImmutable("0x3e51459060e66b6570d1994a5c9cc3d07e5a057c13e5407514df21d19f596e66")
+          assignImmutable("0xae672f8e0c99c611f2eb3d69db180b38f45039e362b9d24521d3f4945565eae9")
+          assignImmutable("0x3e7fe5b9155be15b851844c4a8e6f0a976c2e395efb4f30f9ee97eea8f0ce20f")
+          assignImmutable("0x21c6a7972b66b0c35ecba1c36de5d57657cbf000205a785e808b0b4c4ce20ef4")
+          assignImmutable("0x4e26f2d16eea7e0292a24051cbc7cc5738da627cb8e164620dc5e6eb1d0e03e2")
+          assignImmutable("0xd938a253ffb3229e922cbd95aed81798e77f7df2e8252d39967cf8d5e274639b")
+          assignImmutable("0xa2bd1eb099088b4225f808f7c576eb6591882721490cdd16be1da84d93b838dd")
+          assignImmutable("0xb866b42166d4a63f804e4438264181d0993206ec1f5b239ea7c1fff52a5ea29a")
+          assignImmutable("0xff877c5ec8b168e137236a8f8d797c4f1a2de7afa9f80ddacc87cd23855fbaa5")
           return(0x00, dataSize(sub_0))
         stop
 
@@ -8820,32 +8818,32 @@
               jump     // in
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":14159:14209  SeedERC20Factory public immutable seedERC20Factory */
             tag_25:
-              immutable("0x72e500f04d6bf463abe0ab49ce296c197824c4038654f3d4cdb3caf862ef634e")
+              immutable("0xae672f8e0c99c611f2eb3d69db180b38f45039e362b9d24521d3f4945565eae9")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":13522:13554  address public immutable creator */
             tag_29:
-              immutable("0x26721cef89d6ca54ed4d654aa494650cf46e75d7e3e9eff3a266421b505fedd2")
+              immutable("0xff877c5ec8b168e137236a8f8d797c4f1a2de7afa9f80ddacc87cd23855fbaa5")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":15068:15107  uint256 public immutable successBalance */
             tag_33:
-              immutable("0xfd8d1ed1a43deb872a1a5285e0b64e33422e96d48256d4125a105cc4da5a17c6")
+              immutable("0x3e51459060e66b6570d1994a5c9cc3d07e5a057c13e5407514df21d19f596e66")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":15274:15315  RedeemableERC20Pool public immutable pool */
             tag_37:
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":13615:13659  uint256 public immutable minimumCreatorRaise */
             tag_41:
-              immutable("0x01dee97ea74b75520cf6a46629b466c311f956cbc18a95ae58c573f5867d87a8")
+              immutable("0xb866b42166d4a63f804e4438264181d0993206ec1f5b239ea7c1fff52a5ea29a")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":13872:13907  uint16 public immutable seederUnits */
             tag_44:
-              immutable("0x8a03e496e719530e08b1c00044535339c35147888b0ea9b1d391b17bb162b341")
+              immutable("0x4e26f2d16eea7e0292a24051cbc7cc5738da627cb8e164620dc5e6eb1d0e03e2")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":14847:14874  uint256 public finalBalance */
@@ -8855,12 +8853,12 @@
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":13786:13820  uint256 public immutable seederFee */
             tag_51:
-              immutable("0x1d02ededae9e217eb08394d0854445ae178adbcb8308b3e681eeeee1489ca4c3")
+              immutable("0xd938a253ffb3229e922cbd95aed81798e77f7df2e8252d39967cf8d5e274639b")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":13705:13736  address public immutable seeder */
             tag_54:
-              immutable("0x4082b67cb7af061bf9cf67209517a9191c7bee596624d46eb91d334287a427fb")
+              immutable("0xa2bd1eb099088b4225f808f7c576eb6591882721490cdd16be1da84d93b838dd")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24660:27691  function anonEndDistribution() external nonReentrant {... */
@@ -8903,7 +8901,7 @@
               sstore
               pop
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24738:24742  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24738:24750  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -8982,7 +8980,7 @@
               and
               0x70a08231
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24771:24775  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24771:24779  pool.crp */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -9212,7 +9210,7 @@
               sstore
               pop
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24802:24806  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24802:24827  pool.ownerEndDutchAuction */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -9266,13 +9264,13 @@
               pop
               pop
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25117:25122  token */
-              immutable("0x35e0a5d0f5b0569d1093ec5fdf2f163fb06bd6f948370537b24e994190ee9404")
+              immutable("0x6bff3f8d49e0bf21b445c8bc0d722f5d313e5fbbc155a2a488e033dca4472618")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25117:25138  token.burnDistributor */
               0xffffffffffffffffffffffffffffffffffffffff
               and
               0xde1533ba
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25160:25164  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25160:25168  pool.crp */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -9476,7 +9474,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25278:25295  uint256 poolDust_ */
               0x00
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25298:25302  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25298:25310  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -9555,7 +9553,7 @@
               and
               0x70a08231
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25344:25348  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25344:25352  pool.crp */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -9783,7 +9781,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25659:25684  uint256 availableBalance_ */
               0x00
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25687:25691  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25687:25699  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -9948,7 +9946,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25827:25836  poolDust_ */
               dup4
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25804:25808  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25804:25820  pool.reserveInit */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -10034,7 +10032,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25847:25866  uint256 creatorPay_ */
               0x00
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25977:25991  successBalance */
-              immutable("0xfd8d1ed1a43deb872a1a5285e0b64e33422e96d48256d4125a105cc4da5a17c6")
+              immutable("0x3e51459060e66b6570d1994a5c9cc3d07e5a057c13e5407514df21d19f596e66")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25961:25973  finalBalance */
               sload(0x01)
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":25961:25991  finalBalance >= successBalance */
@@ -10047,7 +10045,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":26081:26091  seederPay_ */
               dup3
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":26096:26105  seederFee */
-              immutable("0x1d02ededae9e217eb08394d0854445ae178adbcb8308b3e681eeeee1489ca4c3")
+              immutable("0xd938a253ffb3229e922cbd95aed81798e77f7df2e8252d39967cf8d5e274639b")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":26081:26095  seederPay_.add */
               tag_84
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":26081:26106  seederPay_.add(seederFee) */
@@ -10063,7 +10061,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":26068:26106  seederPay_ = seederPay_.add(seederFee) */
               dup4
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":26970:26980  redeemInit */
-              immutable("0xf5f368b36bc86e66fa8ba483eecfebd009cf8821c91db5504dc0cb8a9388235a")
+              immutable("0x3e7fe5b9155be15b851844c4a8e6f0a976c2e395efb4f30f9ee97eea8f0ce20f")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":26955:26969  seederPay_.add */
               tag_84
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":26955:26981  seederPay_.add(redeemInit) */
@@ -10091,11 +10089,11 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27038:27133  pool.reserve().safeTransfer(... */
               tag_167
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27083:27090  creator */
-              immutable("0x26721cef89d6ca54ed4d654aa494650cf46e75d7e3e9eff3a266421b505fedd2")
+              immutable("0xff877c5ec8b168e137236a8f8d797c4f1a2de7afa9f80ddacc87cd23855fbaa5")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27108:27119  creatorPay_ */
               dup3
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27038:27042  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27038:27050  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -10183,11 +10181,11 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27154:27235  pool.reserve().safeTransfer(... */
               tag_172
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27195:27201  seeder */
-              immutable("0x4082b67cb7af061bf9cf67209517a9191c7bee596624d46eb91d334287a427fb")
+              immutable("0xa2bd1eb099088b4225f808f7c576eb6591882721490cdd16be1da84d93b838dd")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27215:27225  seederPay_ */
               dup4
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27154:27158  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27154:27166  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -10225,7 +10223,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27469:27487  uint256 remainder_ */
               0x00
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27490:27494  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27490:27502  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -10392,11 +10390,11 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27573:27674  pool.reserve().safeTransfer(... */
               tag_187
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27626:27631  token */
-              immutable("0x35e0a5d0f5b0569d1093ec5fdf2f163fb06bd6f948370537b24e994190ee9404")
+              immutable("0x6bff3f8d49e0bf21b445c8bc0d722f5d313e5fbbc155a2a488e033dca4472618")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27650:27660  remainder_ */
               dup3
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27573:27577  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":27573:27585  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -10451,7 +10449,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23490:23506  Phase poolPhase_ */
               dup1
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23509:23513  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23509:23526  pool.currentPhase */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -10547,7 +10545,7 @@
               tag_200
               jumpi
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23646:23650  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23646:23662  pool.reserveInit */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -10622,7 +10620,7 @@
               jump     // in
             tag_204:
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23603:23607  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23603:23615  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -10701,7 +10699,7 @@
               and
               0x70a08231
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23636:23640  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23603:23642  pool.reserve().balanceOf(address(pool)) */
               mload(0x40)
               dup3
@@ -10873,7 +10871,7 @@
               tag_229
               jumpi
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24113:24127  successBalance */
-              immutable("0xfd8d1ed1a43deb872a1a5285e0b64e33422e96d48256d4125a105cc4da5a17c6")
+              immutable("0x3e51459060e66b6570d1994a5c9cc3d07e5a057c13e5407514df21d19f596e66")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24097:24109  finalBalance */
               sload(0x01)
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":24097:24127  finalBalance >= successBalance */
@@ -10914,7 +10912,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22591:22612  address balancerPool_ */
               0x00
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22623:22627  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22623:22631  pool.crp */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11076,7 +11074,7 @@
               tag_241
               jumpi
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22793:22797  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22793:22805  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11243,7 +11241,7 @@
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22866:22881  token.balanceOf */
               0xffffffffffffffffffffffffffffffffffffffff
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22866:22871  token */
-              immutable("0x35e0a5d0f5b0569d1093ec5fdf2f163fb06bd6f948370537b24e994190ee9404")
+              immutable("0x6bff3f8d49e0bf21b445c8bc0d722f5d313e5fbbc155a2a488e033dca4472618")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22866:22881  token.balanceOf */
               and
               swap1
@@ -11362,7 +11360,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23092:23096  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23092:23108  pool.phaseBlocks */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11452,7 +11450,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23125:23129  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23125:23141  pool.phaseBlocks */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11556,7 +11554,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23222:23226  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23222:23238  pool.reserveInit */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11636,21 +11634,21 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23254:23273  minimumCreatorRaise */
-              immutable("0x01dee97ea74b75520cf6a46629b466c311f956cbc18a95ae58c573f5867d87a8")
+              immutable("0xb866b42166d4a63f804e4438264181d0993206ec1f5b239ea7c1fff52a5ea29a")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23021:23330  DistributionProgress(... */
               dup2
               mstore
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23287:23296  seederFee */
-              immutable("0x1d02ededae9e217eb08394d0854445ae178adbcb8308b3e681eeeee1489ca4c3")
+              immutable("0xd938a253ffb3229e922cbd95aed81798e77f7df2e8252d39967cf8d5e274639b")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23021:23330  DistributionProgress(... */
               dup2
               mstore
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23310:23320  redeemInit */
-              immutable("0xf5f368b36bc86e66fa8ba483eecfebd009cf8821c91db5504dc0cb8a9388235a")
+              immutable("0x3e7fe5b9155be15b851844c4a8e6f0a976c2e395efb4f30f9ee97eea8f0ce20f")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":23021:23330  DistributionProgress(... */
               dup2
               mstore
@@ -11666,12 +11664,12 @@
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":14068:14103  uint256 public immutable redeemInit */
             tag_67:
-              immutable("0xf5f368b36bc86e66fa8ba483eecfebd009cf8821c91db5504dc0cb8a9388235a")
+              immutable("0x3e7fe5b9155be15b851844c4a8e6f0a976c2e395efb4f30f9ee97eea8f0ce20f")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":13971:14017  uint16 public immutable seederCooldownDuration */
             tag_70:
-              immutable("0xc6d20a6e2d6a6b10df8604da3588d27eb010ed1234c7e3e6f35825005532e4d1")
+              immutable("0x21c6a7972b66b0c35ecba1c36de5d57657cbf000205a785e808b0b4c4ce20ef4")
               dup2
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21636:21991  function getContracts() external view returns(TrustContracts memory) {... */
@@ -11690,7 +11688,7 @@
               mstore
               dup1
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21758:21762  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21758:21770  pool.reserve */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11772,7 +11770,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21795:21800  token */
-              immutable("0x35e0a5d0f5b0569d1093ec5fdf2f163fb06bd6f948370537b24e994190ee9404")
+              immutable("0x6bff3f8d49e0bf21b445c8bc0d722f5d313e5fbbc155a2a488e033dca4472618")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21722:21984  TrustContracts(... */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11781,7 +11779,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21823:21827  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21722:21984  TrustContracts(... */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11790,7 +11788,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21850:21856  seeder */
-              immutable("0x4082b67cb7af061bf9cf67209517a9191c7bee596624d46eb91d334287a427fb")
+              immutable("0xa2bd1eb099088b4225f808f7c576eb6591882721490cdd16be1da84d93b838dd")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21722:21984  TrustContracts(... */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11799,7 +11797,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21879:21884  token */
-              immutable("0x35e0a5d0f5b0569d1093ec5fdf2f163fb06bd6f948370537b24e994190ee9404")
+              immutable("0x6bff3f8d49e0bf21b445c8bc0d722f5d313e5fbbc155a2a488e033dca4472618")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21879:21897  token.tierContract */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11881,7 +11879,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21922:21926  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21922:21930  pool.crp */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -11963,7 +11961,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21955:21959  pool */
-              immutable("0x08de92283f35cf2bc11367c7da55ab10d0968f5f7c868b68eecd050570aed268")
+              immutable("0xce17d06453ffca39f5c14b408fa4e3dc04d18c7459e558943073236739d9b41e")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":21955:21963  pool.crp */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -12137,7 +12135,7 @@
               mstore
               dup1
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22171:22178  creator */
-              immutable("0x26721cef89d6ca54ed4d654aa494650cf46e75d7e3e9eff3a266421b505fedd2")
+              immutable("0xff877c5ec8b168e137236a8f8d797c4f1a2de7afa9f80ddacc87cd23855fbaa5")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22138:22389  TrustConfig(... */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -12146,14 +12144,14 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22193:22212  minimumCreatorRaise */
-              immutable("0x01dee97ea74b75520cf6a46629b466c311f956cbc18a95ae58c573f5867d87a8")
+              immutable("0xb866b42166d4a63f804e4438264181d0993206ec1f5b239ea7c1fff52a5ea29a")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22138:22389  TrustConfig(... */
               dup2
               mstore
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22226:22242  seedERC20Factory */
-              immutable("0x72e500f04d6bf463abe0ab49ce296c197824c4038654f3d4cdb3caf862ef634e")
+              immutable("0xae672f8e0c99c611f2eb3d69db180b38f45039e362b9d24521d3f4945565eae9")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22138:22389  TrustConfig(... */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -12162,7 +12160,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22264:22270  seeder */
-              immutable("0x4082b67cb7af061bf9cf67209517a9191c7bee596624d46eb91d334287a427fb")
+              immutable("0xa2bd1eb099088b4225f808f7c576eb6591882721490cdd16be1da84d93b838dd")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22138:22389  TrustConfig(... */
               0xffffffffffffffffffffffffffffffffffffffff
               and
@@ -12171,14 +12169,14 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22285:22294  seederFee */
-              immutable("0x1d02ededae9e217eb08394d0854445ae178adbcb8308b3e681eeeee1489ca4c3")
+              immutable("0xd938a253ffb3229e922cbd95aed81798e77f7df2e8252d39967cf8d5e274639b")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22138:22389  TrustConfig(... */
               dup2
               mstore
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22308:22319  seederUnits */
-              immutable("0x8a03e496e719530e08b1c00044535339c35147888b0ea9b1d391b17bb162b341")
+              immutable("0x4e26f2d16eea7e0292a24051cbc7cc5738da627cb8e164620dc5e6eb1d0e03e2")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22138:22389  TrustConfig(... */
               0xffff
               and
@@ -12187,7 +12185,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22333:22355  seederCooldownDuration */
-              immutable("0xc6d20a6e2d6a6b10df8604da3588d27eb010ed1234c7e3e6f35825005532e4d1")
+              immutable("0x21c6a7972b66b0c35ecba1c36de5d57657cbf000205a785e808b0b4c4ce20ef4")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22138:22389  TrustConfig(... */
               0xffff
               and
@@ -12196,7 +12194,7 @@
               0x20
               add
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22369:22379  redeemInit */
-              immutable("0xf5f368b36bc86e66fa8ba483eecfebd009cf8821c91db5504dc0cb8a9388235a")
+              immutable("0x3e7fe5b9155be15b851844c4a8e6f0a976c2e395efb4f30f9ee97eea8f0ce20f")
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":22138:22389  TrustConfig(... */
               dup2
               mstore
@@ -12209,7 +12207,7 @@
               jump     // out
                 /* "contracts/rain-protocol/contracts/trust/Trust.sol":15170:15208  RedeemableERC20 public immutable token */
             tag_81:
-              immutable("0x35e0a5d0f5b0569d1093ec5fdf2f163fb06bd6f948370537b24e994190ee9404")
+              immutable("0x6bff3f8d49e0bf21b445c8bc0d722f5d313e5fbbc155a2a488e033dca4472618")
               dup2
               jump     // out
                 /* "@openzeppelin/contracts/math/SafeMath.sol":2677:2852  function add(uint256 a, uint256 b) internal pure returns (uint256) {... */
@@ -13201,17 +13199,13 @@
                 /* "--CODEGEN--":15737:15755   */
               dup2
               add
-                /* "--CODEGEN--":25124:25125   */
-              0x06
-                /* "--CODEGEN--":25114:25126   */
-              dup4
-              lt
-                /* "--CODEGEN--":25104:25106   */
+                /* "--CODEGEN--":22824:22880   */
               tag_398
-              jumpi
-                /* "--CODEGEN--":25130:25139   */
-              invalid
-                /* "--CODEGEN--":25104:25106   */
+                /* "--CODEGEN--":22874:22879   */
+              dup4
+                /* "--CODEGEN--":22824:22880   */
+              tag_399
+              jump     // in
             tag_398:
                 /* "--CODEGEN--":4962:5033   */
               swap2
@@ -13257,7 +13251,7 @@
                 /* "--CODEGEN--":22120:22139   */
               mstore
                 /* "--CODEGEN--":5757:5809   */
-              tag_402
+              tag_403
                 /* "--CODEGEN--":5802:5808   */
               dup2
                 /* "--CODEGEN--":22160:22174   */
@@ -13275,7 +13269,7 @@
                 /* "--CODEGEN--":5757:5809   */
               tag_391
               jump     // in
-            tag_402:
+            tag_403:
                 /* "--CODEGEN--":25015:25017   */
               0x1f
                 /* "--CODEGEN--":24995:25009   */
@@ -13567,13 +13561,13 @@
               add
               swap1
                 /* "--CODEGEN--":22824:22880   */
-              tag_412
+              tag_413
                 /* "--CODEGEN--":8981:9004   */
               dup2
                 /* "--CODEGEN--":22824:22880   */
-              tag_413
+              tag_399
               jump     // in
-            tag_412:
+            tag_413:
                 /* "--CODEGEN--":24345:24392   */
               dup1
                 /* "--CODEGEN--":4969:4972   */
@@ -13787,7 +13781,7 @@
               dup5
                 /* "--CODEGEN--":11153:11167   */
               add
-                /* "--CODEGEN--":3622:3659   */
+                /* "--CODEGEN--":4253:4331   */
               mstore
                 /* "--CODEGEN--":23056:23098   */
               dup1
@@ -14128,7 +14122,7 @@
               pop
               jump     // out
                 /* "--CODEGEN--":25032:25146   */
-            tag_413:
+            tag_399:
                 /* "--CODEGEN--":25124:25125   */
               0x06
                 /* "--CODEGEN--":25117:25122   */
+          dup2
+          dup2
+          dup6
+          mload
+          swap1
+      0x20
+      0x60
+      0xffffffffffffffffffffffffffffffffffffffff
+      and
+      and
+      dup1
+      dup1
+      dup7
+      dup8
+      dup8
+      dup9
+      mstore
+      mstore
-              0x06
-              invalid
-              jumpi
-              lt
-          0x20
-          dup8
-          dup8
-      calldataload
-      calldataload
-      dup2
-      dup2
-      dup2
-      dup2
-      dup3
-      dup4
-      dup5
-      swap1
-      swap1

I removed comments, tags and immutables from the above.

Trimmed files

Here are the trimmed sources with a small script to rerun the comparison: trustfactory-debug-2021-11-16.zip.

There's nothing noteworthy there and it's pretty messy but it will save me a lot of time in case I have to dig into it again from where I left off.

@cameel cameel changed the title Different bytecode between Input JSON description and hardhat Different bytecode with same metadata on 0.6.12 Nov 16, 2021
@cameel cameel added this to New issues in Solidity via automation Nov 16, 2021
@cameel
Copy link
Member

cameel commented Nov 17, 2021

@NanezX I'm going to close the issue since it looks like it only affects old releases and is not a critical security issue for which we'd want backport the fix. It seems to have been caused by extra files added the compilation changing AST IDs and these in turn affecting decisions made by the optimizer. This is no longer a problem with newer versions.

Still, thanks for submitting it! We take these kinds of bugs seriously and always want to investigate them. Don't hesitate to reopen or submit another issue if you spot any other problems with bytecode reproducibility.

@cameel cameel closed this as completed Nov 17, 2021
Solidity automation moved this from New issues to Done Nov 17, 2021
@cameel cameel self-assigned this Nov 17, 2021
@NanezX
Copy link
Author

NanezX commented Nov 17, 2021

We're gonna update the solidity version to 0.8.12 and will share here anyway to show the results. Thanks for your help!

@NanezX
Copy link
Author

NanezX commented Nov 18, 2021

Hello! Yesterday we updated the solidity version to 0.8.10, and work perfectly, the whole code match.
Today I verified correclty on etherscan with individuals Input Description JSON, Thanks a lot!

@cameel
Copy link
Member

cameel commented Nov 18, 2021

Great to hear that!

BTW, you mean 0.8.10 of course? Looks like I found the time traveller :P

@NanezX
Copy link
Author

NanezX commented Nov 18, 2021

Yeah, 0.8.10 hahaha. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
No open projects
Solidity
  
Done
Development

No branches or pull requests

3 participants