web3p/web3.php

Error "Undefined array key "coders""

bjutkoski opened this issue ยท 4 comments

I'm having this error Undefined array key "coders" when methods has tuple[] or tuple as input/output

/web3p/web3.php/src/Contracts/Types/Tuple.php:116

input as tuple[]

{
"inputs": [
{
"internalType": "string",
"name": "documentId",
"type": "string"
},
{
"components": [
{
"internalType": "string",
"name": "documentItemId",
"type": "string"
},
{
"internalType": "string",
"name": "id",
"type": "string"
},
{
"internalType": "string",
"name": "locationId",
"type": "string"
},
{
"internalType": "string",
"name": "wasteId",
"type": "string"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"internalType": "struct WasteTraceability.CollectionRequestItem[]",
"name": "collectionRequestItems",
"type": "tuple[]"
}
],
"name": "createCollectionRequest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}

tuple as output

{
"inputs": [
{
"internalType": "string",
"name": "wasteId",
"type": "string"
}
],
"name": "getWaste",
"outputs": [
{
"components": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "uint256",
"name": "decimals",
"type": "uint256"
}
],
"internalType": "struct WasteTraceability.Waste",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
}

i am encountering the same issue now

I have same issue while reading tuple data output

I have modified Ethabi class decodeParameters function as given below and its working fine:

public function decodeParameters($types, $param)
{
if (!is_string($param)) {
throw new InvalidArgumentException('The param must be string.');
}

    // change json to array
    $outputTypes = [];
    if ($types instanceof stdClass && isset($types->outputs)) {
        $types = Utils::jsonToArray($types, 2);
    }
    if (is_array($types) && isset($types['outputs'])) {
        $outputTypes = $types;
        $types = [];
        if(!empty($outputTypes['outputs'][0]['components']))
        {
            foreach ($outputTypes['outputs'][0]['components'] as $component) {
                $types[] = $component['type'];
            }
        }
        else{
            foreach ($outputTypes['outputs'] as $output) {
                if (isset($output['type'])) {
                    $types[] = $output['type'];
                }
            }
        }
    }
    $typesLength = count($types);
    $abiTypes = $this->parseAbiTypes($types);

    // decode with tuple type
    $results = [];
    $decodeResults = $this->types['tuple']->decode(Utils::stripZero($param), 0, [ 'coders' => $abiTypes ]);
    for ($i = 0; $i < $typesLength; $i++) {

        if(!empty($outputTypes['outputs'][0]['components']))
        {
            if (isset($outputTypes['outputs'][0]['components'][$i]['name']) && empty($outputTypes['outputs'][0]['components'][$i]['name']) === false) {
                $results[$outputTypes['outputs'][0]['components'][$i]['name']] = $decodeResults[$i];
            } else {
                $results[$i] = $decodeResults[$i];
            }
        }
        else{
            if (isset($outputTypes['outputs'][$i]['name']) && empty($outputTypes['outputs'][$i]['name']) === false) {
                $results[$outputTypes['outputs'][$i]['name']] = $decodeResults[$i];
            } else {
                $results[$i] = $decodeResults[$i];
            }
        }


    }
    return $results;
}

I have same issue while reading tuple data output

I have modified Ethabi class decodeParameters function as given below and its working fine:

public function decodeParameters($types, $param)
{
if (!is_string($param)) {
throw new InvalidArgumentException('The param must be string.');
}

// change json to array
$outputTypes = [];
if ($types instanceof stdClass && isset($types->outputs)) {
    $types = Utils::jsonToArray($types, 2);
}
if (is_array($types) && isset($types['outputs'])) {
    $outputTypes = $types;
    $types = [];
    if(!empty($outputTypes['outputs'][0]['components']))
    {
        foreach ($outputTypes['outputs'][0]['components'] as $component) {
            $types[] = $component['type'];
        }
    }
    else{
        foreach ($outputTypes['outputs'] as $output) {
            if (isset($output['type'])) {
                $types[] = $output['type'];
            }
        }
    }
}
$typesLength = count($types);
$abiTypes = $this->parseAbiTypes($types);

// decode with tuple type
$results = [];
$decodeResults = $this->types['tuple']->decode(Utils::stripZero($param), 0, [ 'coders' => $abiTypes ]);
for ($i = 0; $i < $typesLength; $i++) {

    if(!empty($outputTypes['outputs'][0]['components']))
    {
        if (isset($outputTypes['outputs'][0]['components'][$i]['name']) && empty($outputTypes['outputs'][0]['components'][$i]['name']) === false) {
            $results[$outputTypes['outputs'][0]['components'][$i]['name']] = $decodeResults[$i];
        } else {
            $results[$i] = $decodeResults[$i];
        }
    }
    else{
        if (isset($outputTypes['outputs'][$i]['name']) && empty($outputTypes['outputs'][$i]['name']) === false) {
            $results[$outputTypes['outputs'][$i]['name']] = $decodeResults[$i];
        } else {
            $results[$i] = $decodeResults[$i];
        }
    }


}
return $results;

}

I have same issue while reading tuple data output

I have modified Ethabi class decodeParameters function as given below and its working fine:

public function decodeParameters($types, $param) { if (!is_string($param)) { throw new InvalidArgumentException('The param must be string.'); }

    // change json to array
    $outputTypes = [];
    if ($types instanceof stdClass && isset($types->outputs)) {
        $types = Utils::jsonToArray($types, 2);
    }
    if (is_array($types) && isset($types['outputs'])) {
        $outputTypes = $types;
        $types = [];
        if(!empty($outputTypes['outputs'][0]['components']))
        {
            foreach ($outputTypes['outputs'][0]['components'] as $component) {
                $types[] = $component['type'];
            }
        }
        else{
            foreach ($outputTypes['outputs'] as $output) {
                if (isset($output['type'])) {
                    $types[] = $output['type'];
                }
            }
        }
    }
    $typesLength = count($types);
    $abiTypes = $this->parseAbiTypes($types);

    // decode with tuple type
    $results = [];
    $decodeResults = $this->types['tuple']->decode(Utils::stripZero($param), 0, [ 'coders' => $abiTypes ]);
    for ($i = 0; $i < $typesLength; $i++) {

        if(!empty($outputTypes['outputs'][0]['components']))
        {
            if (isset($outputTypes['outputs'][0]['components'][$i]['name']) && empty($outputTypes['outputs'][0]['components'][$i]['name']) === false) {
                $results[$outputTypes['outputs'][0]['components'][$i]['name']] = $decodeResults[$i];
            } else {
                $results[$i] = $decodeResults[$i];
            }
        }
        else{
            if (isset($outputTypes['outputs'][$i]['name']) && empty($outputTypes['outputs'][$i]['name']) === false) {
                $results[$outputTypes['outputs'][$i]['name']] = $decodeResults[$i];
            } else {
                $results[$i] = $decodeResults[$i];
            }
        }


    }
    return $results;
}

nice