Konvertiere Bytes in uint256[]

Ich schreibe eine Implementierung von ERC777TokensRecipient. Das bedeutet also eine Funktion

function tokensReceived(address operator, address from, address to, uint256 amount, bytes data, bytes operatorData) external;

Das dataFeld enthält 14 uint256Variablen

0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e

Wie kann ich auf diese Variablen zugreifen?

Ich weiß, dass ich sie so bekommen kann:

function tokensReceived(address _operator, address _from, address _to, uint256 _amount, bytes _data, bytes _operatorData) external {
    uint arg1;
    uint arg2;
    uint arg3;
    uint arg4;
    uint arg5;
    uint arg6;
    uint arg7;
    uint arg8;
    uint arg9;
    uint arg10;
    uint arg11;
    uint arg12;
    uint arg13;
    uint arg14;

    bytes memory tmp = _data;
    assembly {
        arg1  := mload(add(0x020, tmp))
        arg2  := mload(add(0x040, tmp))
        arg3  := mload(add(0x060, tmp))
        arg4  := mload(add(0x080, tmp))
        arg5  := mload(add(0x0A0, tmp))
        arg6  := mload(add(0x0C0, tmp))
        arg7  := mload(add(0x0E0, tmp))
        arg8  := mload(add(0x100, tmp))
        arg9  := mload(add(0x120, tmp))
        arg10 := mload(add(0x140, tmp))
        arg11 := mload(add(0x160, tmp))
        arg12 := mload(add(0x180, tmp))
        arg13 := mload(add(0x1A0, tmp))
        arg14 := mload(add(0x1C0, tmp))
    }
}

Aber ich kann nur 7 der 14 Variablen abrufen, bevor ich auf eine stoße

CompilerError: Stack too deep, try removing local variables.

Laut Error while compiling: Stack too deep besteht die Problemumgehung darin, die lokalen uints in ein Array zu legen. Aber ich weiß nicht, wie man das macht.

Weiß jemand, wie ich eine Funktion wie diese schreiben könnte:

function convertToArrayOfLength14(bytes memory data) internal pure returns (uint[]) {
    // TODO
}

Antworten (1)

Du könntest es in einer Schleife so machen:

function convertToArrayOfLength14(bytes memory data) public pure returns (uint256[] memory output)
{
    output = new uint256[](14);
    for (uint256 i=32; i<=output.length*32; i+=32)
    {
        assembly { mstore(add(output, i), mload(add(data, i))) }
    }
}