1

Is it possible to use the go-ethereum accounts/abi package to encode nested tuples? Say I have a Solidity struct

struct BlockHeader {
    bytes32 parentHash;
}

 struct SignalProof {
     BlockHeader header;
     bytes proof;
 }
    
   function decodes(bytes input) {
      SignalProof memory mkp = abi.decode(input, (SignalProof));
   }

Now, what I want to do is encode it from Golang, but am confused how to do so. From Typescript, I am basically looking for the equivilant of:

const thisWorks = ethers.defaultAbiCoder.Encode(["tuple(tuple(bytes32 parentHash), bytes proof)"],  {header:{parentHash: "0x123"}, proof: ethers.utils.randomBytes(32))`

await contract.decodes(thisWorks)

I have taken a stab but can't quite seem to get it.

blockHeaderType, _ := abi.NewType("tuple", "", []abi.ArgumentMarshaling{
        {Name: "parentHash", Type: "bytes32"},
    })
signalProofType, _ := abi.NewType("tuple", "", []abi.ArgumentMarshaling{
        {Name: "header", Type: "tuple"},
        {Name: "proof", Type: "bytes"},
    })
    signalProofArgs := abi.Arguments{
        {Type: signalProofType},
    }
    
         type BlockHeader struct {
              ParentHash common.Hash
         }
    type SignalProof struct {
        Header BlockHeader
        Proof []byte
        }
        
         // etc, make a SignalProof with nested Blockheader, call signalProofArgs.Pack, pass it in to the .decodes, doesnt work

Is nested tuple possible?

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.