From 617125ae29b686542b73952f6d7dee5e5e4df0d7 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Fri, 24 Nov 2023 01:07:05 +0800 Subject: [PATCH 01/14] Add function to link binary with reference libraries and wrappers --- .../codegen/SolidityFunctionWrapper.java | 17 ++++++++-- .../web3j/codegen/ContractJsonParseTest.java | 13 ++++++++ .../codegen/SolidityFunctionWrapperTest.java | 12 +++++++ core/src/main/java/org/web3j/tx/Contract.java | 33 +++++++++++++++++-- 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index e7e3838d33..9746569aa5 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -262,6 +262,7 @@ public void generateJavaFiles( buildLoad(className, TransactionManager.class, TRANSACTION_MANAGER, true)); if (!bin.equals(Contract.BIN_NOT_PROVIDED)) { classBuilder.addMethods(buildDeployMethods(className, classBuilder, abi)); + classBuilder.addMethod(buildLinkLibraryFunction()); } addAddressesSupport(classBuilder, addresses); @@ -383,7 +384,7 @@ private String getWeb3jVersion() { private FieldSpec createBinaryDefinition(String binary) { if (binary.length() < 65534) { return FieldSpec.builder(String.class, BINARY) - .addModifiers(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC) + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .initializer("$S", binary) .build(); } @@ -397,7 +398,7 @@ private FieldSpec createBinaryDefinition(String binary) { } stringBuilderString.append(".toString()"); return FieldSpec.builder(String.class, BINARY) - .addModifiers(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC) + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .initializer(CodeBlock.of(stringBuilderString.toString())) .build(); } @@ -1456,6 +1457,18 @@ List buildFunctions( return results; } + MethodSpec buildLinkLibraryFunction() { + MethodSpec.Builder methodBuilder = + MethodSpec.methodBuilder("linkLibraries") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addParameter(ParameterizedTypeName.get( + ClassName.get(List.class), ClassName.get(Contract.LinkReference.class)), "references") + .addStatement(BINARY + " = " + "linkBinaryWithReferences(" + BINARY + ", references)"); + + return methodBuilder.build(); + + } + private void buildConstantFunction( AbiDefinition functionDefinition, MethodSpec.Builder methodBuilder, diff --git a/codegen/src/test/java/org/web3j/codegen/ContractJsonParseTest.java b/codegen/src/test/java/org/web3j/codegen/ContractJsonParseTest.java index 17469c2537..ace92bc924 100644 --- a/codegen/src/test/java/org/web3j/codegen/ContractJsonParseTest.java +++ b/codegen/src/test/java/org/web3j/codegen/ContractJsonParseTest.java @@ -14,10 +14,12 @@ import java.io.File; import java.net.URL; +import java.util.Collections; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.web3j.abi.datatypes.Address; import org.web3j.protocol.core.methods.response.AbiDefinition; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -25,6 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.web3j.codegen.TruffleJsonFunctionWrapperGenerator.Contract; import static org.web3j.codegen.TruffleJsonFunctionWrapperGenerator.loadContractDefinition; +import static org.web3j.tx.Contract.linkBinaryWithReferences; /** Test that we can parse Truffle Contract from JSON file. */ public class ContractJsonParseTest { @@ -80,4 +83,14 @@ public void testParseConvertLib() throws Exception { abi.getStateMutability(), "Expected the 'pure' for the state mutability setting"); } + + @Test + public void testLinkBinaryWithReferences() throws Exception { + Contract mc = parseContractJson(contractBaseDir, "MetaCoin", "MetaCoin"); + assertTrue(mc.getBytecode().contains("__ConvertLib____________________________")); + + String linked = linkBinaryWithReferences(mc.getBytecode(), Collections.singletonList(new org.web3j.tx.Contract.LinkReference("./ConvertLib.sol", "ConvertLib" , Address.DEFAULT))); + assertFalse(linked.contains("__ConvertLib____________________________")); + assertEquals(mc.getBytecode().replace("__ConvertLib____________________________", Address.DEFAULT.toString().substring(2)), linked); + } } diff --git a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java index 0faa58a5a6..07fc645ccb 100644 --- a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java +++ b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java @@ -971,4 +971,16 @@ public void testBuildFunctionConstantSingleValueReturnAndTransaction() throws Ex assertEquals(expectedCall, methodSpecs.get(0).toString()); assertEquals(expectedSend, methodSpecs.get(1).toString()); } + + @Test + public void testBuildFunctionLinkBinaryWithReferences() throws Exception { + MethodSpec methodSpec = solidityFunctionWrapper.buildLinkLibraryFunction(); + + String expected = + "public static void linkLibraries(java.util.List references) {\n" + + " BINARY = linkBinaryWithReferences(BINARY, references);\n" + + "}\n"; + + assertEquals(methodSpec.toString(), (expected)); + } } diff --git a/core/src/main/java/org/web3j/tx/Contract.java b/core/src/main/java/org/web3j/tx/Contract.java index 9ec65a7feb..47c6c519f7 100644 --- a/core/src/main/java/org/web3j/tx/Contract.java +++ b/core/src/main/java/org/web3j/tx/Contract.java @@ -52,8 +52,9 @@ import org.web3j.tx.gas.ContractGasProvider; import org.web3j.tx.gas.StaticGasProvider; import org.web3j.tx.response.EmptyTransactionReceipt; -import org.web3j.utils.Numeric; +import static org.web3j.crypto.Hash.sha3String; +import static org.web3j.utils.Numeric.cleanHexPrefix; import static org.web3j.utils.RevertReasonExtractor.extractRevertReason; /** @@ -262,7 +263,7 @@ public boolean isValid() throws IOException { return false; } - String code = Numeric.cleanHexPrefix(ethGetCode.getCode()); + String code = cleanHexPrefix(ethGetCode.getCode()); int metadataIndex = -1; for (String metadataIndicator : METADATA_HASH_INDICATORS) { @@ -488,6 +489,34 @@ private static T create( return contract; } + public static class LinkReference { + final String source; + final String libraryName; + final Address address; + + public LinkReference(String source, String libraryName, Address address) { + this.source = source; + this.libraryName = libraryName; + this.address = address; + } + } + + public static String linkBinaryWithReferences(String binary, List links){ + String replacingBinary = binary; + for(LinkReference link: links) { + //solc / hardhat convention + String libSourceName = link.source + ":" + link.libraryName; + String placeHolder = "__$" + sha3String(libSourceName).substring(2, 36) + "$__"; + String addressReplacement = cleanHexPrefix(link.address.toString()); + replacingBinary = replacingBinary.replace(placeHolder, addressReplacement); + + //truffle old version + String trufflePlaceHolder = "__" + link.libraryName + "_".repeat(40 - link.libraryName.length() - 2); + replacingBinary = replacingBinary.replace(trufflePlaceHolder, addressReplacement); + } + return replacingBinary; + } + protected static T deploy( Class type, Web3j web3j, From b3212ad8a4283b07262fdd86f02a8c4aca4a2a84 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Fri, 24 Nov 2023 01:08:34 +0800 Subject: [PATCH 02/14] Add function to link binary with reference libraries and wrappers --- .../main/java/org/web3j/codegen/SolidityFunctionWrapper.java | 4 ++-- .../java/org/web3j/codegen/SolidityFunctionWrapperTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index 9746569aa5..2c089fe57f 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -262,7 +262,7 @@ public void generateJavaFiles( buildLoad(className, TransactionManager.class, TRANSACTION_MANAGER, true)); if (!bin.equals(Contract.BIN_NOT_PROVIDED)) { classBuilder.addMethods(buildDeployMethods(className, classBuilder, abi)); - classBuilder.addMethod(buildLinkLibraryFunction()); + classBuilder.addMethod(buildLinkLibraryMethod()); } addAddressesSupport(classBuilder, addresses); @@ -1457,7 +1457,7 @@ List buildFunctions( return results; } - MethodSpec buildLinkLibraryFunction() { + MethodSpec buildLinkLibraryMethod() { MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("linkLibraries") .addModifiers(Modifier.PUBLIC, Modifier.STATIC) diff --git a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java index 07fc645ccb..f42ee044de 100644 --- a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java +++ b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java @@ -974,7 +974,7 @@ public void testBuildFunctionConstantSingleValueReturnAndTransaction() throws Ex @Test public void testBuildFunctionLinkBinaryWithReferences() throws Exception { - MethodSpec methodSpec = solidityFunctionWrapper.buildLinkLibraryFunction(); + MethodSpec methodSpec = solidityFunctionWrapper.buildLinkLibraryMethod(); String expected = "public static void linkLibraries(java.util.List references) {\n" + From 87c4027a3e5415d20859d7fc784ad1d8c1743c21 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Wed, 13 Mar 2024 14:40:28 +0800 Subject: [PATCH 03/14] spotless apply --- .../web3j/codegen/SolidityFunctionWrapper.java | 17 ++++++++++++----- .../web3j/codegen/ContractJsonParseTest.java | 14 ++++++++++++-- .../codegen/SolidityFunctionWrapperTest.java | 6 +++--- core/src/main/java/org/web3j/tx/Contract.java | 11 ++++++----- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index 2c089fe57f..31f74187ca 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -1460,13 +1460,20 @@ List buildFunctions( MethodSpec buildLinkLibraryMethod() { MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("linkLibraries") - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .addParameter(ParameterizedTypeName.get( - ClassName.get(List.class), ClassName.get(Contract.LinkReference.class)), "references") - .addStatement(BINARY + " = " + "linkBinaryWithReferences(" + BINARY + ", references)"); + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addParameter( + ParameterizedTypeName.get( + ClassName.get(List.class), + ClassName.get(Contract.LinkReference.class)), + "references") + .addStatement( + BINARY + + " = " + + "linkBinaryWithReferences(" + + BINARY + + ", references)"); return methodBuilder.build(); - } private void buildConstantFunction( diff --git a/codegen/src/test/java/org/web3j/codegen/ContractJsonParseTest.java b/codegen/src/test/java/org/web3j/codegen/ContractJsonParseTest.java index ace92bc924..3eba2facc3 100644 --- a/codegen/src/test/java/org/web3j/codegen/ContractJsonParseTest.java +++ b/codegen/src/test/java/org/web3j/codegen/ContractJsonParseTest.java @@ -89,8 +89,18 @@ public void testLinkBinaryWithReferences() throws Exception { Contract mc = parseContractJson(contractBaseDir, "MetaCoin", "MetaCoin"); assertTrue(mc.getBytecode().contains("__ConvertLib____________________________")); - String linked = linkBinaryWithReferences(mc.getBytecode(), Collections.singletonList(new org.web3j.tx.Contract.LinkReference("./ConvertLib.sol", "ConvertLib" , Address.DEFAULT))); + String linked = + linkBinaryWithReferences( + mc.getBytecode(), + Collections.singletonList( + new org.web3j.tx.Contract.LinkReference( + "./ConvertLib.sol", "ConvertLib", Address.DEFAULT))); assertFalse(linked.contains("__ConvertLib____________________________")); - assertEquals(mc.getBytecode().replace("__ConvertLib____________________________", Address.DEFAULT.toString().substring(2)), linked); + assertEquals( + mc.getBytecode() + .replace( + "__ConvertLib____________________________", + Address.DEFAULT.toString().substring(2)), + linked); } } diff --git a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java index f42ee044de..beba18c120 100644 --- a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java +++ b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java @@ -977,9 +977,9 @@ public void testBuildFunctionLinkBinaryWithReferences() throws Exception { MethodSpec methodSpec = solidityFunctionWrapper.buildLinkLibraryMethod(); String expected = - "public static void linkLibraries(java.util.List references) {\n" + - " BINARY = linkBinaryWithReferences(BINARY, references);\n" + - "}\n"; + "public static void linkLibraries(java.util.List references) {\n" + + " BINARY = linkBinaryWithReferences(BINARY, references);\n" + + "}\n"; assertEquals(methodSpec.toString(), (expected)); } diff --git a/core/src/main/java/org/web3j/tx/Contract.java b/core/src/main/java/org/web3j/tx/Contract.java index 47c6c519f7..37bba88ea6 100644 --- a/core/src/main/java/org/web3j/tx/Contract.java +++ b/core/src/main/java/org/web3j/tx/Contract.java @@ -501,17 +501,18 @@ public LinkReference(String source, String libraryName, Address address) { } } - public static String linkBinaryWithReferences(String binary, List links){ + public static String linkBinaryWithReferences(String binary, List links) { String replacingBinary = binary; - for(LinkReference link: links) { - //solc / hardhat convention + for (LinkReference link : links) { + // solc / hardhat convention String libSourceName = link.source + ":" + link.libraryName; String placeHolder = "__$" + sha3String(libSourceName).substring(2, 36) + "$__"; String addressReplacement = cleanHexPrefix(link.address.toString()); replacingBinary = replacingBinary.replace(placeHolder, addressReplacement); - //truffle old version - String trufflePlaceHolder = "__" + link.libraryName + "_".repeat(40 - link.libraryName.length() - 2); + // truffle old version + String trufflePlaceHolder = + "__" + link.libraryName + "_".repeat(40 - link.libraryName.length() - 2); replacingBinary = replacingBinary.replace(trufflePlaceHolder, addressReplacement); } return replacingBinary; From 68bf887d0659263bc494841aa88042284e74f36d Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Wed, 13 Mar 2024 15:16:04 +0800 Subject: [PATCH 04/14] Fix test --- .../main/java/org/web3j/codegen/unit/gen/MethodFilter.java | 3 ++- .../web3j/codegen/SolidityFunctionWrapperGeneratorTest.java | 6 +++--- .../solidity/arraysinstruct/build/java/ArraysInStruct.java | 2 +- .../eventparameters/build/java/EventParameters.java | 2 +- .../onlyinarraystruct/build/java/OnlyInArrayStruct.java | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java b/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java index 82a71e5526..c527ac601e 100644 --- a/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java +++ b/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java @@ -37,7 +37,8 @@ public static List extractValidMethods(Class contract) { && parametersAreMatching(m) && !m.getName().toLowerCase().contains("event") && !m.getName().equals("load") - && !m.getName().equals("kill")) + && !m.getName().equals("kill") + && !m.getName().equals("linkLibraries")) .collect(Collectors.toList()); } diff --git a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java index df795d1553..a8f51294d2 100644 --- a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java +++ b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java @@ -218,9 +218,9 @@ private void compareJavaFile(String inputFileName) throws Exception { "java", inputFileName + ".java"), File.separator)); - assertEquals( - new String(Files.readAllBytes(fileExpected.toPath())).replaceAll("(\r\n|\n)", ""), - new String(Files.readAllBytes(fileActual.toPath())).replaceAll("(\r\n|\n)", "")); + String s1 = new String(Files.readAllBytes(fileExpected.toPath())); + String s2 = new String(Files.readAllBytes(fileActual.toPath())); + assertEquals(s1.replaceAll("(\r\n|\n)", ""), s2.replaceAll("(\r\n|\n)", "")); } private void testCodeGenerationJvmTypes(String contractName, String inputFileName) diff --git a/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java b/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java index 9468b4373f..f9d4230770 100644 --- a/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java +++ b/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java @@ -39,7 +39,7 @@ */ @SuppressWarnings("rawtypes") public class ArraysInStruct extends Contract { - public static final String BINARY = "Bin file was not provided"; + public static String BINARY = "Bin file was not provided"; public static final String FUNC_CALLFUNCTION = "callFunction"; diff --git a/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java b/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java index 0fbc8ea5db..4fa13d61a1 100644 --- a/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java +++ b/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java @@ -37,7 +37,7 @@ */ @SuppressWarnings("rawtypes") public class EventParameters extends Contract { - public static final String BINARY = "Bin file was not provided"; + public static String BINARY = "Bin file was not provided"; public static final String FUNC__CONTRACTNUMBER = "_contractNumber"; diff --git a/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java b/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java index 044692b05e..0984956bcd 100644 --- a/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java +++ b/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java @@ -30,7 +30,7 @@ */ @SuppressWarnings("rawtypes") public class OnlyInArrayStruct extends Contract { - public static final String BINARY = "Bin file was not provided"; + public static String BINARY = "Bin file was not provided"; public static final String FUNC_GETFOO = "getFoo"; From ee34a7b31e117b7cd71654b5d6bc2fe4ff3a44f5 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 14:24:03 +0800 Subject: [PATCH 05/14] Revert "Fix test" This reverts commit b9898febba62d457095bb4676bc6b0e63c5ef701. --- .../main/java/org/web3j/codegen/unit/gen/MethodFilter.java | 3 +-- .../web3j/codegen/SolidityFunctionWrapperGeneratorTest.java | 6 +++--- .../solidity/arraysinstruct/build/java/ArraysInStruct.java | 2 +- .../eventparameters/build/java/EventParameters.java | 2 +- .../onlyinarraystruct/build/java/OnlyInArrayStruct.java | 2 +- .../web3j/protocol/core/methods/response/Transaction.java | 6 +----- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java b/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java index c527ac601e..82a71e5526 100644 --- a/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java +++ b/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java @@ -37,8 +37,7 @@ public static List extractValidMethods(Class contract) { && parametersAreMatching(m) && !m.getName().toLowerCase().contains("event") && !m.getName().equals("load") - && !m.getName().equals("kill") - && !m.getName().equals("linkLibraries")) + && !m.getName().equals("kill")) .collect(Collectors.toList()); } diff --git a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java index a8f51294d2..df795d1553 100644 --- a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java +++ b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java @@ -218,9 +218,9 @@ private void compareJavaFile(String inputFileName) throws Exception { "java", inputFileName + ".java"), File.separator)); - String s1 = new String(Files.readAllBytes(fileExpected.toPath())); - String s2 = new String(Files.readAllBytes(fileActual.toPath())); - assertEquals(s1.replaceAll("(\r\n|\n)", ""), s2.replaceAll("(\r\n|\n)", "")); + assertEquals( + new String(Files.readAllBytes(fileExpected.toPath())).replaceAll("(\r\n|\n)", ""), + new String(Files.readAllBytes(fileActual.toPath())).replaceAll("(\r\n|\n)", "")); } private void testCodeGenerationJvmTypes(String contractName, String inputFileName) diff --git a/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java b/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java index f9d4230770..9468b4373f 100644 --- a/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java +++ b/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java @@ -39,7 +39,7 @@ */ @SuppressWarnings("rawtypes") public class ArraysInStruct extends Contract { - public static String BINARY = "Bin file was not provided"; + public static final String BINARY = "Bin file was not provided"; public static final String FUNC_CALLFUNCTION = "callFunction"; diff --git a/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java b/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java index 4fa13d61a1..0fbc8ea5db 100644 --- a/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java +++ b/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java @@ -37,7 +37,7 @@ */ @SuppressWarnings("rawtypes") public class EventParameters extends Contract { - public static String BINARY = "Bin file was not provided"; + public static final String BINARY = "Bin file was not provided"; public static final String FUNC__CONTRACTNUMBER = "_contractNumber"; diff --git a/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java b/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java index 0984956bcd..044692b05e 100644 --- a/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java +++ b/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java @@ -30,7 +30,7 @@ */ @SuppressWarnings("rawtypes") public class OnlyInArrayStruct extends Contract { - public static String BINARY = "Bin file was not provided"; + public static final String BINARY = "Bin file was not provided"; public static final String FUNC_GETFOO = "getFoo"; diff --git a/core/src/main/java/org/web3j/protocol/core/methods/response/Transaction.java b/core/src/main/java/org/web3j/protocol/core/methods/response/Transaction.java index 9f7ceff8f6..8762ac08ea 100644 --- a/core/src/main/java/org/web3j/protocol/core/methods/response/Transaction.java +++ b/core/src/main/java/org/web3j/protocol/core/methods/response/Transaction.java @@ -615,11 +615,7 @@ public int hashCode() { + (getMaxFeePerBlobGasRaw() != null ? getMaxFeePerBlobGasRaw().hashCode() : 0); - result = - 31 * result - + (getBlobVersionedHashes() != null - ? getBlobVersionedHashes().hashCode() - : 0); + result = 31 * result + (getBlobVersionedHashes() != null ? getBlobVersionedHashes().hashCode() : 0); result = 31 * result + (getAccessList() != null ? getAccessList().hashCode() : 0); return result; } From 8eee5a2106c12c43d3f423da7f9450c3a927c530 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 14:34:38 +0800 Subject: [PATCH 06/14] Use a separate variable for libraries linked binary --- .../codegen/SolidityFunctionWrapper.java | 69 ++++++++++++------- .../web3j/codegen/unit/gen/MethodFilter.java | 3 +- .../codegen/SolidityFunctionWrapperTest.java | 2 +- .../build/java/ArraysInStruct.java | 10 +++ .../build/java/EventParameters.java | 10 +++ .../build/java/OnlyInArrayStruct.java | 10 +++ 6 files changed, 78 insertions(+), 26 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index 31f74187ca..d51bbc0d19 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -90,6 +90,7 @@ public class SolidityFunctionWrapper extends Generator { private static final String BINARY = "BINARY"; + private static final String LIBRARIES_LINKED_BINARY = "librariesLinkedBinary"; private static final String WEB3J = "web3j"; private static final String CREDENTIALS = "credentials"; private static final String CONTRACT_GAS_PROVIDER = "contractGasProvider"; @@ -265,6 +266,8 @@ public void generateJavaFiles( classBuilder.addMethod(buildLinkLibraryMethod()); } + classBuilder.addMethod(buildGetDeploymentBinaryMethod()); + addAddressesSupport(classBuilder, addresses); write(basePackageName, classBuilder.build(), destinationDir); @@ -365,7 +368,8 @@ private TypeSpec.Builder createClassBuilder( .addModifiers(Modifier.PUBLIC) .addJavadoc(javadoc) .superclass(contractClass) - .addField(createBinaryDefinition(binary)); + .addField(createBinaryDefinition(binary)) + .addField(createLibrariesLinkedBinary()); } private String getWeb3jVersion() { @@ -381,10 +385,16 @@ private String getWeb3jVersion() { return "\n

Generated with web3j version " + version + ".\n"; } + private FieldSpec createLibrariesLinkedBinary() { + return FieldSpec.builder(String.class, LIBRARIES_LINKED_BINARY) + .addModifiers(Modifier.PRIVATE, Modifier.STATIC) + .build(); + } + private FieldSpec createBinaryDefinition(String binary) { if (binary.length() < 65534) { return FieldSpec.builder(String.class, BINARY) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addModifiers(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC) .initializer("$S", binary) .build(); } @@ -398,7 +408,7 @@ private FieldSpec createBinaryDefinition(String binary) { } stringBuilderString.append(".toString()"); return FieldSpec.builder(String.class, BINARY) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addModifiers(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC) .initializer(CodeBlock.of(stringBuilderString.toString())) .build(); } @@ -654,6 +664,25 @@ private Set getDuplicateFunctionNames(List functionDefini return duplicateNames; } + private static MethodSpec buildGetDeploymentBinaryMethod() { + MethodSpec.Builder toReturn = + MethodSpec.methodBuilder("getDeploymentBinary") + .addModifiers(Modifier.PRIVATE, Modifier.STATIC) + .returns(ClassName.get(String.class)); + + CodeBlock codeBlock = CodeBlock.builder() + .beginControlFlow("if ($L != null)", LIBRARIES_LINKED_BINARY) + .addStatement("return $L", LIBRARIES_LINKED_BINARY) + .nextControlFlow("else") + .addStatement("return $L", BINARY) + .endControlFlow() + .build(); + + toReturn.addCode(codeBlock); + + return toReturn.build(); + } + List buildDeployMethods( String className, TypeSpec.Builder classBuilder, @@ -850,43 +879,39 @@ private static MethodSpec buildDeployWithParams( if (isPayable && !withGasProvider) { methodBuilder.addStatement( "return deployRemoteCall(" - + "$L.class, $L, $L, $L, $L, $L, encodedConstructor, $L)", + + "$L.class, $L, $L, $L, $L, getDeploymentBinary(), encodedConstructor, $L)", className, WEB3J, authName, GAS_PRICE, GAS_LIMIT, - BINARY, INITIAL_VALUE); methodBuilder.addAnnotation(Deprecated.class); } else if (isPayable && withGasProvider) { methodBuilder.addStatement( "return deployRemoteCall(" - + "$L.class, $L, $L, $L, $L, encodedConstructor, $L)", + + "$L.class, $L, $L, $L, getDeploymentBinary(), encodedConstructor, $L)", className, WEB3J, authName, CONTRACT_GAS_PROVIDER, - BINARY, INITIAL_VALUE); } else if (!isPayable && !withGasProvider) { methodBuilder.addStatement( - "return deployRemoteCall($L.class, $L, $L, $L, $L, $L, encodedConstructor)", + "return deployRemoteCall($L.class, $L, $L, $L, $L, getDeploymentBinary(), encodedConstructor)", className, WEB3J, authName, GAS_PRICE, - GAS_LIMIT, - BINARY); + GAS_LIMIT); methodBuilder.addAnnotation(Deprecated.class); } else { methodBuilder.addStatement( - "return deployRemoteCall($L.class, $L, $L, $L, $L, encodedConstructor)", + "return deployRemoteCall($L.class, $L, $L, $L, getDeploymentBinary(), encodedConstructor)", className, WEB3J, authName, - CONTRACT_GAS_PROVIDER, - BINARY); + CONTRACT_GAS_PROVIDER); } return methodBuilder.build(); @@ -900,42 +925,38 @@ private static MethodSpec buildDeployNoParams( boolean withGasProvider) { if (isPayable && !withGasProvider) { methodBuilder.addStatement( - "return deployRemoteCall($L.class, $L, $L, $L, $L, $L, \"\", $L)", + "return deployRemoteCall($L.class, $L, $L, $L, $L, getDeploymentBinary(), \"\", $L)", className, WEB3J, authName, GAS_PRICE, GAS_LIMIT, - BINARY, INITIAL_VALUE); methodBuilder.addAnnotation(Deprecated.class); } else if (isPayable && withGasProvider) { methodBuilder.addStatement( - "return deployRemoteCall($L.class, $L, $L, $L, $L, \"\", $L)", + "return deployRemoteCall($L.class, $L, $L, $L, getDeploymentBinary(), \"\", $L)", className, WEB3J, authName, CONTRACT_GAS_PROVIDER, - BINARY, INITIAL_VALUE); } else if (!isPayable && !withGasProvider) { methodBuilder.addStatement( - "return deployRemoteCall($L.class, $L, $L, $L, $L, $L, \"\")", + "return deployRemoteCall($L.class, $L, $L, $L, $L, getDeploymentBinary(), \"\")", className, WEB3J, authName, GAS_PRICE, - GAS_LIMIT, - BINARY); + GAS_LIMIT); methodBuilder.addAnnotation(Deprecated.class); } else { methodBuilder.addStatement( - "return deployRemoteCall($L.class, $L, $L, $L, $L, \"\")", + "return deployRemoteCall($L.class, $L, $L, $L, getDeploymentBinary(), \"\")", className, WEB3J, authName, - CONTRACT_GAS_PROVIDER, - BINARY); + CONTRACT_GAS_PROVIDER); } return methodBuilder.build(); @@ -1467,7 +1488,7 @@ MethodSpec buildLinkLibraryMethod() { ClassName.get(Contract.LinkReference.class)), "references") .addStatement( - BINARY + LIBRARIES_LINKED_BINARY + " = " + "linkBinaryWithReferences(" + BINARY diff --git a/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java b/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java index 82a71e5526..c527ac601e 100644 --- a/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java +++ b/codegen/src/main/java/org/web3j/codegen/unit/gen/MethodFilter.java @@ -37,7 +37,8 @@ public static List extractValidMethods(Class contract) { && parametersAreMatching(m) && !m.getName().toLowerCase().contains("event") && !m.getName().equals("load") - && !m.getName().equals("kill")) + && !m.getName().equals("kill") + && !m.getName().equals("linkLibraries")) .collect(Collectors.toList()); } diff --git a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java index beba18c120..8e6f044bd2 100644 --- a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java +++ b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperTest.java @@ -978,7 +978,7 @@ public void testBuildFunctionLinkBinaryWithReferences() throws Exception { String expected = "public static void linkLibraries(java.util.List references) {\n" - + " BINARY = linkBinaryWithReferences(BINARY, references);\n" + + " librariesLinkedBinary = linkBinaryWithReferences(BINARY, references);\n" + "}\n"; assertEquals(methodSpec.toString(), (expected)); diff --git a/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java b/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java index 9468b4373f..200bf4954a 100644 --- a/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java +++ b/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java @@ -41,6 +41,8 @@ public class ArraysInStruct extends Contract { public static final String BINARY = "Bin file was not provided"; + private static String librariesLinkedBinary; + public static final String FUNC_CALLFUNCTION = "callFunction"; @Deprecated @@ -90,6 +92,14 @@ public static ArraysInStruct load(String contractAddress, Web3j web3j, Transacti return new ArraysInStruct(contractAddress, web3j, transactionManager, contractGasProvider); } + private static String getDeploymentBinary() { + if (librariesLinkedBinary != null) { + return librariesLinkedBinary; + } else { + return BINARY; + } + } + public static class Entity extends DynamicStruct { public byte[] bytesField; diff --git a/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java b/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java index 0fbc8ea5db..0c4bde2340 100644 --- a/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java +++ b/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java @@ -39,6 +39,8 @@ public class EventParameters extends Contract { public static final String BINARY = "Bin file was not provided"; + private static String librariesLinkedBinary; + public static final String FUNC__CONTRACTNUMBER = "_contractNumber"; public static final String FUNC__TESTADDRESS = "_testAddress"; @@ -143,6 +145,14 @@ public static EventParameters load(String contractAddress, Web3j web3j, Transact return new EventParameters(contractAddress, web3j, transactionManager, contractGasProvider); } + private static String getDeploymentBinary() { + if (librariesLinkedBinary != null) { + return librariesLinkedBinary; + } else { + return BINARY; + } + } + public static class TestEventEventResponse extends BaseEventResponse { public BigInteger _contractNumber; diff --git a/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java b/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java index 044692b05e..64d640d59c 100644 --- a/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java +++ b/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java @@ -32,6 +32,8 @@ public class OnlyInArrayStruct extends Contract { public static final String BINARY = "Bin file was not provided"; + private static String librariesLinkedBinary; + public static final String FUNC_GETFOO = "getFoo"; public static final String FUNC_SETFOO = "setFoo"; @@ -95,6 +97,14 @@ public static OnlyInArrayStruct load(String contractAddress, Web3j web3j, Transa return new OnlyInArrayStruct(contractAddress, web3j, transactionManager, contractGasProvider); } + private static String getDeploymentBinary() { + if (librariesLinkedBinary != null) { + return librariesLinkedBinary; + } else { + return BINARY; + } + } + public static class Foo extends DynamicStruct { public String id; From a7c974804ed2c9d9c0a332efdd051b8573e8d779 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 14:35:35 +0800 Subject: [PATCH 07/14] spotless apply --- .../web3j/codegen/SolidityFunctionWrapper.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index d51bbc0d19..948f604e4c 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -670,13 +670,14 @@ private static MethodSpec buildGetDeploymentBinaryMethod() { .addModifiers(Modifier.PRIVATE, Modifier.STATIC) .returns(ClassName.get(String.class)); - CodeBlock codeBlock = CodeBlock.builder() - .beginControlFlow("if ($L != null)", LIBRARIES_LINKED_BINARY) - .addStatement("return $L", LIBRARIES_LINKED_BINARY) - .nextControlFlow("else") - .addStatement("return $L", BINARY) - .endControlFlow() - .build(); + CodeBlock codeBlock = + CodeBlock.builder() + .beginControlFlow("if ($L != null)", LIBRARIES_LINKED_BINARY) + .addStatement("return $L", LIBRARIES_LINKED_BINARY) + .nextControlFlow("else") + .addStatement("return $L", BINARY) + .endControlFlow() + .build(); toReturn.addCode(codeBlock); From 9a54232886f527abefcb30b9a27b64d8c823ad29 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 16:10:29 +0800 Subject: [PATCH 08/14] Add test case for deploy generated --- .../SolidityFunctionWrapperGeneratorTest.java | 16 +- .../solidity/metacoin/ConvertLib.sol | 8 + .../resources/solidity/metacoin/MetaCoin.sol | 34 ++++ .../solidity/metacoin/build/ConvertLib.abi | 1 + .../solidity/metacoin/build/ConvertLib.bin | 1 + .../solidity/metacoin/build/MetaCoin.abi | 1 + .../solidity/metacoin/build/MetaCoin.bin | 1 + .../metacoin/build/java/MetaCoin.java | 184 ++++++++++++++++++ core/src/main/java/org/web3j/tx/Contract.java | 6 + 9 files changed, 247 insertions(+), 5 deletions(-) create mode 100644 codegen/src/test/resources/solidity/metacoin/ConvertLib.sol create mode 100644 codegen/src/test/resources/solidity/metacoin/MetaCoin.sol create mode 100644 codegen/src/test/resources/solidity/metacoin/build/ConvertLib.abi create mode 100644 codegen/src/test/resources/solidity/metacoin/build/ConvertLib.bin create mode 100644 codegen/src/test/resources/solidity/metacoin/build/MetaCoin.abi create mode 100644 codegen/src/test/resources/solidity/metacoin/build/MetaCoin.bin create mode 100644 codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java diff --git a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java index df795d1553..c9f156d035 100644 --- a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java +++ b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java @@ -143,12 +143,12 @@ public void testStructOnlyInArray() throws Exception { @Test public void testStructOnlyInArrayCompareJavaFile() throws Exception { - compareJavaFile("OnlyInArrayStruct"); + compareJavaFile("OnlyInArrayStruct", false); } @Test public void testArraysInStructCompareJavaFileTest() throws Exception { - compareJavaFile("ArraysInStruct"); + compareJavaFile("ArraysInStruct", false); } @Test @@ -199,14 +199,20 @@ public void testEventParametersNoNamed() throws Exception { @Test public void testEventParametersNoNamedCompareJavaFile() throws Exception { - compareJavaFile("EventParameters"); + compareJavaFile("EventParameters", false); } - private void compareJavaFile(String inputFileName) throws Exception { + @Test + public void testDeployMethodGenerated() throws Exception { + compareJavaFile("MetaCoin", false); + compareJavaFile("MetaCoin", true); + } + + private void compareJavaFile(String inputFileName, boolean useBin) throws Exception { String contract = inputFileName.toLowerCase(); String packagePath = generateCode( - emptyList(), contract, inputFileName, JAVA_TYPES_ARG, false, false, false); + emptyList(), contract, inputFileName, JAVA_TYPES_ARG, useBin, false, false); File fileActual = new File(tempDirPath, packagePath + "/" + inputFileName + ".java"); File fileExpected = new File( diff --git a/codegen/src/test/resources/solidity/metacoin/ConvertLib.sol b/codegen/src/test/resources/solidity/metacoin/ConvertLib.sol new file mode 100644 index 0000000000..4ac9d791a6 --- /dev/null +++ b/codegen/src/test/resources/solidity/metacoin/ConvertLib.sol @@ -0,0 +1,8 @@ +pragma solidity >=0.4.22; + +library ConvertLib{ + function convert(uint amount,uint conversionRate) pure public returns (uint convertedAmount) + { + return amount * conversionRate; + } +} diff --git a/codegen/src/test/resources/solidity/metacoin/MetaCoin.sol b/codegen/src/test/resources/solidity/metacoin/MetaCoin.sol new file mode 100644 index 0000000000..51a433d528 --- /dev/null +++ b/codegen/src/test/resources/solidity/metacoin/MetaCoin.sol @@ -0,0 +1,34 @@ +pragma solidity >=0.4.22; + +import "./ConvertLib.sol"; + +// This is just a simple example of a coin-like contract. +// It is not standards compatible and cannot be expected to talk to other +// coin/token contracts. If you want to create a standards-compliant +// token, see: https://github.com/ConsenSys/Tokens. Cheers! + +contract MetaCoin { + mapping (address => uint) balances; + + event Transfer(address indexed _from, address indexed _to, uint256 _value); + + constructor() public { + balances[tx.origin] = 10000; + } + + function sendCoin(address receiver, uint amount) public returns(bool sufficient) { + if (balances[msg.sender] < amount) return false; + balances[msg.sender] -= amount; + balances[receiver] += amount; + emit Transfer(msg.sender, receiver, amount); + return true; + } + + function getBalanceInEth(address addr) view public returns(uint){ + return ConvertLib.convert(getBalance(addr),2); + } + + function getBalance(address addr) view public returns(uint) { + return balances[addr]; + } +} diff --git a/codegen/src/test/resources/solidity/metacoin/build/ConvertLib.abi b/codegen/src/test/resources/solidity/metacoin/build/ConvertLib.abi new file mode 100644 index 0000000000..49f6fa9f48 --- /dev/null +++ b/codegen/src/test/resources/solidity/metacoin/build/ConvertLib.abi @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"amount","type":"uint256"},{"name":"conversionRate","type":"uint256"}],"name":"convert","outputs":[{"name":"convertedAmount","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"}] \ No newline at end of file diff --git a/codegen/src/test/resources/solidity/metacoin/build/ConvertLib.bin b/codegen/src/test/resources/solidity/metacoin/build/ConvertLib.bin new file mode 100644 index 0000000000..363b7bcdd2 --- /dev/null +++ b/codegen/src/test/resources/solidity/metacoin/build/ConvertLib.bin @@ -0,0 +1 @@ +60d061002f600b82828239805160001a6073146000811461001f57610021565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146080604052600436106056576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806396e4ee3d14605b575b600080fd5b608160048036038101908080359060200190929190803590602001909291905050506097565b6040518082815260200191505060405180910390f35b60008183029050929150505600a165627a7a723058209a76e0cbee3d5aca13830553d698d9c7fbadf548a1e9ab38e4076c862c065cff0029 \ No newline at end of file diff --git a/codegen/src/test/resources/solidity/metacoin/build/MetaCoin.abi b/codegen/src/test/resources/solidity/metacoin/build/MetaCoin.abi new file mode 100644 index 0000000000..6e4487ba46 --- /dev/null +++ b/codegen/src/test/resources/solidity/metacoin/build/MetaCoin.abi @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getBalanceInEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"sendCoin","outputs":[{"name":"sufficient","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"}] \ No newline at end of file diff --git a/codegen/src/test/resources/solidity/metacoin/build/MetaCoin.bin b/codegen/src/test/resources/solidity/metacoin/build/MetaCoin.bin new file mode 100644 index 0000000000..1a0aef6769 --- /dev/null +++ b/codegen/src/test/resources/solidity/metacoin/build/MetaCoin.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506103fc806100656000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680637bd703e81461005c57806390b98a11146100b3578063f8b2cb4f14610118575b600080fd5b34801561006857600080fd5b5061009d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061016f565b6040518082815260200191505060405180910390f35b3480156100bf57600080fd5b506100fe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061022f565b604051808215151515815260200191505060405180910390f35b34801561012457600080fd5b50610159600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610388565b6040518082815260200191505060405180910390f35b600073__./ConvertLib.sol:ConvertLib___________6396e4ee3d61019484610388565b60026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018281526020019250505060206040518083038186803b1580156101ed57600080fd5b505af4158015610201573d6000803e3d6000fd5b505050506040513d602081101561021757600080fd5b81019080805190602001909291905050509050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156102805760009050610382565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b92915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509190505600a165627a7a72305820b5847021f1d1274ef7c16ae13702c8f4be7bc863436d40346b0d38824300763b0029 \ No newline at end of file diff --git a/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java b/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java new file mode 100644 index 0000000000..4cff508610 --- /dev/null +++ b/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java @@ -0,0 +1,184 @@ +package org.web3j.unittests.java; + +import io.reactivex.Flowable; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.web3j.abi.EventEncoder; +import org.web3j.abi.TypeReference; +import org.web3j.abi.datatypes.Address; +import org.web3j.abi.datatypes.Event; +import org.web3j.abi.datatypes.Function; +import org.web3j.abi.datatypes.Type; +import org.web3j.abi.datatypes.generated.Uint256; +import org.web3j.crypto.Credentials; +import org.web3j.protocol.Web3j; +import org.web3j.protocol.core.DefaultBlockParameter; +import org.web3j.protocol.core.RemoteCall; +import org.web3j.protocol.core.RemoteFunctionCall; +import org.web3j.protocol.core.methods.request.EthFilter; +import org.web3j.protocol.core.methods.response.BaseEventResponse; +import org.web3j.protocol.core.methods.response.Log; +import org.web3j.protocol.core.methods.response.TransactionReceipt; +import org.web3j.tx.Contract; +import org.web3j.tx.TransactionManager; +import org.web3j.tx.gas.ContractGasProvider; + +/** + *

Auto generated code. + *

Do not modify! + *

Please use the web3j command line tools, + * or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the + * codegen module to update. + * + *

Generated with web3j version none. + */ +@SuppressWarnings("rawtypes") +public class MetaCoin extends Contract { + public static final String BINARY = "608060405234801561001057600080fd5b506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506103fc806100656000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680637bd703e81461005c57806390b98a11146100b3578063f8b2cb4f14610118575b600080fd5b34801561006857600080fd5b5061009d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061016f565b6040518082815260200191505060405180910390f35b3480156100bf57600080fd5b506100fe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061022f565b604051808215151515815260200191505060405180910390f35b34801561012457600080fd5b50610159600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610388565b6040518082815260200191505060405180910390f35b600073__./ConvertLib.sol:ConvertLib___________6396e4ee3d61019484610388565b60026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018281526020019250505060206040518083038186803b1580156101ed57600080fd5b505af4158015610201573d6000803e3d6000fd5b505050506040513d602081101561021757600080fd5b81019080805190602001909291905050509050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156102805760009050610382565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b92915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509190505600a165627a7a72305820b5847021f1d1274ef7c16ae13702c8f4be7bc863436d40346b0d38824300763b0029"; + + private static String librariesLinkedBinary; + + public static final String FUNC_GETBALANCEINETH = "getBalanceInEth"; + + public static final String FUNC_SENDCOIN = "sendCoin"; + + public static final String FUNC_GETBALANCE = "getBalance"; + + public static final Event TRANSFER_EVENT = new Event("Transfer", + Arrays.>asList(new TypeReference

(true) {}, new TypeReference
(true) {}, new TypeReference() {})); + ; + + @Deprecated + protected MetaCoin(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { + super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit); + } + + protected MetaCoin(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) { + super(BINARY, contractAddress, web3j, credentials, contractGasProvider); + } + + @Deprecated + protected MetaCoin(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { + super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit); + } + + protected MetaCoin(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) { + super(BINARY, contractAddress, web3j, transactionManager, contractGasProvider); + } + + public RemoteFunctionCall getBalanceInEth(String addr) { + final Function function = new Function(FUNC_GETBALANCEINETH, + Arrays.asList(new org.web3j.abi.datatypes.Address(160, addr)), + Arrays.>asList(new TypeReference() {})); + return executeRemoteCallSingleValueReturn(function, BigInteger.class); + } + + public RemoteFunctionCall sendCoin(String receiver, BigInteger amount) { + final Function function = new Function( + FUNC_SENDCOIN, + Arrays.asList(new org.web3j.abi.datatypes.Address(160, receiver), + new org.web3j.abi.datatypes.generated.Uint256(amount)), + Collections.>emptyList()); + return executeRemoteCallTransaction(function); + } + + public RemoteFunctionCall getBalance(String addr) { + final Function function = new Function(FUNC_GETBALANCE, + Arrays.asList(new org.web3j.abi.datatypes.Address(160, addr)), + Arrays.>asList(new TypeReference() {})); + return executeRemoteCallSingleValueReturn(function, BigInteger.class); + } + + public static List getTransferEvents(TransactionReceipt transactionReceipt) { + List valueList = staticExtractEventParametersWithLog(TRANSFER_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + TransferEventResponse typedResponse = new TransferEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse._from = (String) eventValues.getIndexedValues().get(0).getValue(); + typedResponse._to = (String) eventValues.getIndexedValues().get(1).getValue(); + typedResponse._value = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public static TransferEventResponse getTransferEventFromLog(Log log) { + Contract.EventValuesWithLog eventValues = staticExtractEventParametersWithLog(TRANSFER_EVENT, log); + TransferEventResponse typedResponse = new TransferEventResponse(); + typedResponse.log = log; + typedResponse._from = (String) eventValues.getIndexedValues().get(0).getValue(); + typedResponse._to = (String) eventValues.getIndexedValues().get(1).getValue(); + typedResponse._value = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); + return typedResponse; + } + + public Flowable transferEventFlowable(EthFilter filter) { + return web3j.ethLogFlowable(filter).map(log -> getTransferEventFromLog(log)); + } + + public Flowable transferEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { + EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); + filter.addSingleTopic(EventEncoder.encode(TRANSFER_EVENT)); + return transferEventFlowable(filter); + } + + @Deprecated + public static MetaCoin load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { + return new MetaCoin(contractAddress, web3j, credentials, gasPrice, gasLimit); + } + + @Deprecated + public static MetaCoin load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { + return new MetaCoin(contractAddress, web3j, transactionManager, gasPrice, gasLimit); + } + + public static MetaCoin load(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) { + return new MetaCoin(contractAddress, web3j, credentials, contractGasProvider); + } + + public static MetaCoin load(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) { + return new MetaCoin(contractAddress, web3j, transactionManager, contractGasProvider); + } + + public static RemoteCall deploy(Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) { + return deployRemoteCall(MetaCoin.class, web3j, credentials, contractGasProvider, getDeploymentBinary(), ""); + } + + public static RemoteCall deploy(Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) { + return deployRemoteCall(MetaCoin.class, web3j, transactionManager, contractGasProvider, getDeploymentBinary(), ""); + } + + @Deprecated + public static RemoteCall deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { + return deployRemoteCall(MetaCoin.class, web3j, credentials, gasPrice, gasLimit, getDeploymentBinary(), ""); + } + + @Deprecated + public static RemoteCall deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { + return deployRemoteCall(MetaCoin.class, web3j, transactionManager, gasPrice, gasLimit, getDeploymentBinary(), ""); + } + + public static void linkLibraries(List references) { + librariesLinkedBinary = linkBinaryWithReferences(BINARY, references); + } + + private static String getDeploymentBinary() { + if (librariesLinkedBinary != null) { + return librariesLinkedBinary; + } else { + return BINARY; + } + } + + public static class TransferEventResponse extends BaseEventResponse { + public String _from; + + public String _to; + + public BigInteger _value; + } +} diff --git a/core/src/main/java/org/web3j/tx/Contract.java b/core/src/main/java/org/web3j/tx/Contract.java index 37bba88ea6..1eb8649a22 100644 --- a/core/src/main/java/org/web3j/tx/Contract.java +++ b/core/src/main/java/org/web3j/tx/Contract.java @@ -510,6 +510,12 @@ public static String linkBinaryWithReferences(String binary, List String addressReplacement = cleanHexPrefix(link.address.toString()); replacingBinary = replacingBinary.replace(placeHolder, addressReplacement); + // old version solc + String linkString = link.source + ":" + link.libraryName; + String oldSolcPlaceHolder = + "__" + linkString + "_".repeat(40 - linkString.length() - 2); + replacingBinary = replacingBinary.replace(oldSolcPlaceHolder, addressReplacement); + // truffle old version String trufflePlaceHolder = "__" + link.libraryName + "_".repeat(40 - link.libraryName.length() - 2); From 8a3a25422b1f88b9a73a7d3ae47cc9881b7b8b18 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 16:22:30 +0800 Subject: [PATCH 09/14] Add check for compilation in test case --- .../org/web3j/codegen/GeneraterTestUtils.java | 25 +++++++++++++++++++ .../SolidityFunctionWrapperGeneratorTest.java | 4 ++- ...uffleJsonFunctionWrapperGeneratorTest.java | 24 +----------------- 3 files changed, 29 insertions(+), 24 deletions(-) create mode 100644 codegen/src/test/java/org/web3j/codegen/GeneraterTestUtils.java diff --git a/codegen/src/test/java/org/web3j/codegen/GeneraterTestUtils.java b/codegen/src/test/java/org/web3j/codegen/GeneraterTestUtils.java new file mode 100644 index 0000000000..102ec7b2e5 --- /dev/null +++ b/codegen/src/test/java/org/web3j/codegen/GeneraterTestUtils.java @@ -0,0 +1,25 @@ +package org.web3j.codegen; + +import javax.tools.*; +import java.io.IOException; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class GeneraterTestUtils { + + public static void verifyGeneratedCode(String sourceFile) throws IOException { + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + DiagnosticCollector diagnostics = new DiagnosticCollector<>(); + + try (StandardJavaFileManager fileManager = + compiler.getStandardFileManager(diagnostics, null, null)) { + Iterable compilationUnits = + fileManager.getJavaFileObjectsFromStrings( + Collections.singletonList(sourceFile)); + JavaCompiler.CompilationTask task = + compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits); + assertTrue(task.call(), "Generated contract contains compile time error"); + } + } +} diff --git a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java index c9f156d035..f6a8baafdb 100644 --- a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java +++ b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java @@ -20,6 +20,7 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import javax.tools.*; @@ -204,7 +205,6 @@ public void testEventParametersNoNamedCompareJavaFile() throws Exception { @Test public void testDeployMethodGenerated() throws Exception { - compareJavaFile("MetaCoin", false); compareJavaFile("MetaCoin", true); } @@ -227,6 +227,8 @@ private void compareJavaFile(String inputFileName, boolean useBin) throws Except assertEquals( new String(Files.readAllBytes(fileExpected.toPath())).replaceAll("(\r\n|\n)", ""), new String(Files.readAllBytes(fileActual.toPath())).replaceAll("(\r\n|\n)", "")); + + verifyGeneratedCode(fileActual.getAbsolutePath()); } private void testCodeGenerationJvmTypes(String contractName, String inputFileName) diff --git a/codegen/src/test/java/org/web3j/codegen/TruffleJsonFunctionWrapperGeneratorTest.java b/codegen/src/test/java/org/web3j/codegen/TruffleJsonFunctionWrapperGeneratorTest.java index 5db3e341d0..8d11caef0d 100644 --- a/codegen/src/test/java/org/web3j/codegen/TruffleJsonFunctionWrapperGeneratorTest.java +++ b/codegen/src/test/java/org/web3j/codegen/TruffleJsonFunctionWrapperGeneratorTest.java @@ -13,15 +13,8 @@ package org.web3j.codegen; import java.io.File; -import java.io.IOException; import java.net.URL; import java.util.Arrays; -import java.util.Collections; -import javax.tools.DiagnosticCollector; -import javax.tools.JavaCompiler; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.ToolProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -39,21 +32,6 @@ public class TruffleJsonFunctionWrapperGeneratorTest extends TempFileProvider { private String contractBaseDir; - private static void verifyGeneratedCode(String sourceFile) throws IOException { - JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); - DiagnosticCollector diagnostics = new DiagnosticCollector<>(); - - try (StandardJavaFileManager fileManager = - compiler.getStandardFileManager(diagnostics, null, null)) { - Iterable compilationUnits = - fileManager.getJavaFileObjectsFromStrings( - Collections.singletonList(sourceFile)); - JavaCompiler.CompilationTask task = - compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits); - assertTrue(task.call(), "Generated contract contains compile time error"); - } - } - @BeforeEach public void setUp() throws Exception { super.setUp(); @@ -103,7 +81,7 @@ private void testCodeGeneration( tempDirPath) .toArray(new String[0])); - verifyGeneratedCode( + GeneraterTestUtils.verifyGeneratedCode( tempDirPath + File.separator + packageName.replace('.', File.separatorChar) From 1649ec9cfefcb020bf7952a3f4c1415342f35731 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 16:23:19 +0800 Subject: [PATCH 10/14] spotless apply --- .../org/web3j/codegen/GeneraterTestUtils.java | 40 ++++++++++++------- .../SolidityFunctionWrapperGeneratorTest.java | 1 - ...uffleJsonFunctionWrapperGeneratorTest.java | 1 - 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/codegen/src/test/java/org/web3j/codegen/GeneraterTestUtils.java b/codegen/src/test/java/org/web3j/codegen/GeneraterTestUtils.java index 102ec7b2e5..384ea7b103 100644 --- a/codegen/src/test/java/org/web3j/codegen/GeneraterTestUtils.java +++ b/codegen/src/test/java/org/web3j/codegen/GeneraterTestUtils.java @@ -1,25 +1,37 @@ +/* + * Copyright 2024 Web3 Labs Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ package org.web3j.codegen; -import javax.tools.*; import java.io.IOException; import java.util.Collections; +import javax.tools.*; import static org.junit.jupiter.api.Assertions.assertTrue; public class GeneraterTestUtils { - public static void verifyGeneratedCode(String sourceFile) throws IOException { - JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); - DiagnosticCollector diagnostics = new DiagnosticCollector<>(); + public static void verifyGeneratedCode(String sourceFile) throws IOException { + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + DiagnosticCollector diagnostics = new DiagnosticCollector<>(); - try (StandardJavaFileManager fileManager = - compiler.getStandardFileManager(diagnostics, null, null)) { - Iterable compilationUnits = - fileManager.getJavaFileObjectsFromStrings( - Collections.singletonList(sourceFile)); - JavaCompiler.CompilationTask task = - compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits); - assertTrue(task.call(), "Generated contract contains compile time error"); - } - } + try (StandardJavaFileManager fileManager = + compiler.getStandardFileManager(diagnostics, null, null)) { + Iterable compilationUnits = + fileManager.getJavaFileObjectsFromStrings( + Collections.singletonList(sourceFile)); + JavaCompiler.CompilationTask task = + compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits); + assertTrue(task.call(), "Generated contract contains compile time error"); + } + } } diff --git a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java index f6a8baafdb..82f8307ff7 100644 --- a/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java +++ b/codegen/src/test/java/org/web3j/codegen/SolidityFunctionWrapperGeneratorTest.java @@ -20,7 +20,6 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import javax.tools.*; diff --git a/codegen/src/test/java/org/web3j/codegen/TruffleJsonFunctionWrapperGeneratorTest.java b/codegen/src/test/java/org/web3j/codegen/TruffleJsonFunctionWrapperGeneratorTest.java index 8d11caef0d..223e0d5d02 100644 --- a/codegen/src/test/java/org/web3j/codegen/TruffleJsonFunctionWrapperGeneratorTest.java +++ b/codegen/src/test/java/org/web3j/codegen/TruffleJsonFunctionWrapperGeneratorTest.java @@ -22,7 +22,6 @@ import org.web3j.TempFileProvider; import org.web3j.utils.Strings; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.web3j.codegen.FunctionWrapperGenerator.JAVA_TYPES_ARG; import static org.web3j.codegen.FunctionWrapperGenerator.SOLIDITY_TYPES_ARG; From 33e6ca59ecfd48ff4932af23ae75e59a28488f66 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 16:36:37 +0800 Subject: [PATCH 11/14] Do not need to generate link library code when not use bin --- .../org/web3j/codegen/SolidityFunctionWrapper.java | 6 +++--- .../arraysinstruct/build/java/ArraysInStruct.java | 10 ---------- .../eventparameters/build/java/EventParameters.java | 10 ---------- .../solidity/metacoin/build/java/MetaCoin.java | 4 ++-- .../build/java/OnlyInArrayStruct.java | 10 ---------- 5 files changed, 5 insertions(+), 35 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index 948f604e4c..ce0fcc1911 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -263,10 +263,11 @@ public void generateJavaFiles( buildLoad(className, TransactionManager.class, TRANSACTION_MANAGER, true)); if (!bin.equals(Contract.BIN_NOT_PROVIDED)) { classBuilder.addMethods(buildDeployMethods(className, classBuilder, abi)); + classBuilder.addField(createLibrariesLinkedBinary()); classBuilder.addMethod(buildLinkLibraryMethod()); + classBuilder.addMethod(buildGetDeploymentBinaryMethod()); } - classBuilder.addMethod(buildGetDeploymentBinaryMethod()); addAddressesSupport(classBuilder, addresses); @@ -368,8 +369,7 @@ private TypeSpec.Builder createClassBuilder( .addModifiers(Modifier.PUBLIC) .addJavadoc(javadoc) .superclass(contractClass) - .addField(createBinaryDefinition(binary)) - .addField(createLibrariesLinkedBinary()); + .addField(createBinaryDefinition(binary)); } private String getWeb3jVersion() { diff --git a/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java b/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java index 200bf4954a..9468b4373f 100644 --- a/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java +++ b/codegen/src/test/resources/solidity/arraysinstruct/build/java/ArraysInStruct.java @@ -41,8 +41,6 @@ public class ArraysInStruct extends Contract { public static final String BINARY = "Bin file was not provided"; - private static String librariesLinkedBinary; - public static final String FUNC_CALLFUNCTION = "callFunction"; @Deprecated @@ -92,14 +90,6 @@ public static ArraysInStruct load(String contractAddress, Web3j web3j, Transacti return new ArraysInStruct(contractAddress, web3j, transactionManager, contractGasProvider); } - private static String getDeploymentBinary() { - if (librariesLinkedBinary != null) { - return librariesLinkedBinary; - } else { - return BINARY; - } - } - public static class Entity extends DynamicStruct { public byte[] bytesField; diff --git a/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java b/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java index 0c4bde2340..0fbc8ea5db 100644 --- a/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java +++ b/codegen/src/test/resources/solidity/eventparameters/build/java/EventParameters.java @@ -39,8 +39,6 @@ public class EventParameters extends Contract { public static final String BINARY = "Bin file was not provided"; - private static String librariesLinkedBinary; - public static final String FUNC__CONTRACTNUMBER = "_contractNumber"; public static final String FUNC__TESTADDRESS = "_testAddress"; @@ -145,14 +143,6 @@ public static EventParameters load(String contractAddress, Web3j web3j, Transact return new EventParameters(contractAddress, web3j, transactionManager, contractGasProvider); } - private static String getDeploymentBinary() { - if (librariesLinkedBinary != null) { - return librariesLinkedBinary; - } else { - return BINARY; - } - } - public static class TestEventEventResponse extends BaseEventResponse { public BigInteger _contractNumber; diff --git a/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java b/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java index 4cff508610..81d2ab139e 100644 --- a/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java +++ b/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java @@ -39,8 +39,6 @@ public class MetaCoin extends Contract { public static final String BINARY = "608060405234801561001057600080fd5b506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506103fc806100656000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680637bd703e81461005c57806390b98a11146100b3578063f8b2cb4f14610118575b600080fd5b34801561006857600080fd5b5061009d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061016f565b6040518082815260200191505060405180910390f35b3480156100bf57600080fd5b506100fe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061022f565b604051808215151515815260200191505060405180910390f35b34801561012457600080fd5b50610159600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610388565b6040518082815260200191505060405180910390f35b600073__./ConvertLib.sol:ConvertLib___________6396e4ee3d61019484610388565b60026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018281526020019250505060206040518083038186803b1580156101ed57600080fd5b505af4158015610201573d6000803e3d6000fd5b505050506040513d602081101561021757600080fd5b81019080805190602001909291905050509050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156102805760009050610382565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b92915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509190505600a165627a7a72305820b5847021f1d1274ef7c16ae13702c8f4be7bc863436d40346b0d38824300763b0029"; - private static String librariesLinkedBinary; - public static final String FUNC_GETBALANCEINETH = "getBalanceInEth"; public static final String FUNC_SENDCOIN = "sendCoin"; @@ -51,6 +49,8 @@ public class MetaCoin extends Contract { Arrays.>asList(new TypeReference
(true) {}, new TypeReference
(true) {}, new TypeReference() {})); ; + private static String librariesLinkedBinary; + @Deprecated protected MetaCoin(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit); diff --git a/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java b/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java index 64d640d59c..044692b05e 100644 --- a/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java +++ b/codegen/src/test/resources/solidity/onlyinarraystruct/build/java/OnlyInArrayStruct.java @@ -32,8 +32,6 @@ public class OnlyInArrayStruct extends Contract { public static final String BINARY = "Bin file was not provided"; - private static String librariesLinkedBinary; - public static final String FUNC_GETFOO = "getFoo"; public static final String FUNC_SETFOO = "setFoo"; @@ -97,14 +95,6 @@ public static OnlyInArrayStruct load(String contractAddress, Web3j web3j, Transa return new OnlyInArrayStruct(contractAddress, web3j, transactionManager, contractGasProvider); } - private static String getDeploymentBinary() { - if (librariesLinkedBinary != null) { - return librariesLinkedBinary; - } else { - return BINARY; - } - } - public static class Foo extends DynamicStruct { public String id; From 4ebb3ad44e2642fb17b24e08dc2abd898aa0c9e5 Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 16:39:59 +0800 Subject: [PATCH 12/14] spot apply --- .../src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index ce0fcc1911..41ef188af9 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -268,7 +268,6 @@ public void generateJavaFiles( classBuilder.addMethod(buildGetDeploymentBinaryMethod()); } - addAddressesSupport(classBuilder, addresses); write(basePackageName, classBuilder.build(), destinationDir); From 99f2ef66c7af4ed6ed9ed8888bb2f50754b8a83c Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 16:45:36 +0800 Subject: [PATCH 13/14] rearrange fields position --- .../org/web3j/codegen/SolidityFunctionWrapper.java | 10 +++++++--- .../solidity/metacoin/build/java/MetaCoin.java | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index 41ef188af9..6c37921d46 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -263,7 +263,6 @@ public void generateJavaFiles( buildLoad(className, TransactionManager.class, TRANSACTION_MANAGER, true)); if (!bin.equals(Contract.BIN_NOT_PROVIDED)) { classBuilder.addMethods(buildDeployMethods(className, classBuilder, abi)); - classBuilder.addField(createLibrariesLinkedBinary()); classBuilder.addMethod(buildLinkLibraryMethod()); classBuilder.addMethod(buildGetDeploymentBinaryMethod()); } @@ -364,11 +363,16 @@ private TypeSpec.Builder createClassBuilder( String javadoc = CODEGEN_WARNING + getWeb3jVersion(); - return TypeSpec.classBuilder(className) + TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className) .addModifiers(Modifier.PUBLIC) .addJavadoc(javadoc) .superclass(contractClass) .addField(createBinaryDefinition(binary)); + + if (!binary.equals(Contract.BIN_NOT_PROVIDED)) { + classBuilder.addField(createLibrariesLinkedBinaryField()); + } + return classBuilder; } private String getWeb3jVersion() { @@ -384,7 +388,7 @@ private String getWeb3jVersion() { return "\n

Generated with web3j version " + version + ".\n"; } - private FieldSpec createLibrariesLinkedBinary() { + private FieldSpec createLibrariesLinkedBinaryField() { return FieldSpec.builder(String.class, LIBRARIES_LINKED_BINARY) .addModifiers(Modifier.PRIVATE, Modifier.STATIC) .build(); diff --git a/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java b/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java index 81d2ab139e..4cff508610 100644 --- a/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java +++ b/codegen/src/test/resources/solidity/metacoin/build/java/MetaCoin.java @@ -39,6 +39,8 @@ public class MetaCoin extends Contract { public static final String BINARY = "608060405234801561001057600080fd5b506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506103fc806100656000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680637bd703e81461005c57806390b98a11146100b3578063f8b2cb4f14610118575b600080fd5b34801561006857600080fd5b5061009d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061016f565b6040518082815260200191505060405180910390f35b3480156100bf57600080fd5b506100fe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061022f565b604051808215151515815260200191505060405180910390f35b34801561012457600080fd5b50610159600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610388565b6040518082815260200191505060405180910390f35b600073__./ConvertLib.sol:ConvertLib___________6396e4ee3d61019484610388565b60026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018281526020019250505060206040518083038186803b1580156101ed57600080fd5b505af4158015610201573d6000803e3d6000fd5b505050506040513d602081101561021757600080fd5b81019080805190602001909291905050509050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156102805760009050610382565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b92915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509190505600a165627a7a72305820b5847021f1d1274ef7c16ae13702c8f4be7bc863436d40346b0d38824300763b0029"; + private static String librariesLinkedBinary; + public static final String FUNC_GETBALANCEINETH = "getBalanceInEth"; public static final String FUNC_SENDCOIN = "sendCoin"; @@ -49,8 +51,6 @@ public class MetaCoin extends Contract { Arrays.>asList(new TypeReference

(true) {}, new TypeReference
(true) {}, new TypeReference() {})); ; - private static String librariesLinkedBinary; - @Deprecated protected MetaCoin(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit); From c495a397ec48de36304faea4131707c454d2e0ba Mon Sep 17 00:00:00 2001 From: tonykwok1992 Date: Thu, 14 Mar 2024 16:46:12 +0800 Subject: [PATCH 14/14] spotless apply --- .../org/web3j/codegen/SolidityFunctionWrapper.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index 6c37921d46..ecd8e420ac 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -363,11 +363,12 @@ private TypeSpec.Builder createClassBuilder( String javadoc = CODEGEN_WARNING + getWeb3jVersion(); - TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className) - .addModifiers(Modifier.PUBLIC) - .addJavadoc(javadoc) - .superclass(contractClass) - .addField(createBinaryDefinition(binary)); + TypeSpec.Builder classBuilder = + TypeSpec.classBuilder(className) + .addModifiers(Modifier.PUBLIC) + .addJavadoc(javadoc) + .superclass(contractClass) + .addField(createBinaryDefinition(binary)); if (!binary.equals(Contract.BIN_NOT_PROVIDED)) { classBuilder.addField(createLibrariesLinkedBinaryField());