fix(core): correctly encode dynamic constructor params on contract deploy - #223
Merged
kuny0707 merged 1 commit intoAug 6, 2026
Conversation
… head Utils.encodeParameter and ContractConstructor.encodeParameter concatenated per-parameter TypeEncoder.encode() output, which omits the offset pointer that dynamic types (string/bytes/array) require in the ABI tuple head. Deploying a contract whose constructor takes any dynamic parameter (e.g. a TRC20-style constructor with string name/symbol) produced malformed calldata that reverted on-chain. Static-only parameters encoded correctly and were unaffected. Both methods now delegate to FunctionEncoder.encodeConstructor, the canonical head/tail tuple encoder already used for function-call encoding, so the two deploy paths (ApiWrapper.deployContract, Contract.createSmartContract) are fixed without changing their call sites. Add a Nile on-chain integration test (disabled by default) that deploys a contract with a dynamic string constructor parameter and reads the stored value back.
317787106
approved these changes
Aug 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
Utils.encodeParameterandContractConstructor.encodeParameternow delegate toFunctionEncoder.encodeConstructor— the canonical head/tail tuple encoder already usedfor function-call encoding — instead of concatenating per-parameter
TypeEncoder.encode()output. Dynamic-type parameters (
string/bytes/ array) now carry their offsetpointer in the ABI tuple head.
Why are these changes required?
This PR has been tested by:
ConstructorDynamicParamDeployTest(added,@Disabledby default — requires a funded Nileprivate key in
application-test.properties) deploys aconstructor(string)contractthrough
ApiWrapper.deployContract, asserts the deploy succeeds, then reads the storedvalue back with a constant
name()call.Extra details