More readability for 1155 proxy

This commit is contained in:
Greg Hysen 2019-05-29 14:25:24 -07:00
parent b596e02752
commit dde4ed3754

View File

@ -164,42 +164,45 @@ contract ERC1155Proxy is
let assetDataLength := calldataload(assetDataOffset) let assetDataLength := calldataload(assetDataOffset)
// Load offset to parameters section in asset data // Load offset to parameters section in asset data
let offsetToParamsInAssetData := add(assetDataOffset, 36) let paramsInAssetDataOffset := add(assetDataOffset, 36)
// Memory offset of Data Area when stored in memory (Table #3) // Offset of end of Data Area in memory.
let dataAreaPtr := 164 // This value will grow as we construct Table #3.
let dataAreaEndOffset := 164
// Load amount by which to scale values // Load amount by which to scale values
let amount := calldataload(100) let amount := calldataload(100)
// Store pointer to `ids` (Table #3) // Store pointer to `ids` (Table #3)
mstore(68, sub(dataAreaPtr, 4)) // Subtract 4 for `safeBatchTrasferFrom` selector
mstore(68, sub(dataAreaEndOffset, 4))
// Copy `ids` from `assetData` (Table #2) to memory (Table #3) // Copy `ids` from `assetData` (Table #2) to memory (Table #3)
let offsetToIds := add(offsetToParamsInAssetData, calldataload(add(assetDataOffset, 68))) let idsOffset := add(paramsInAssetDataOffset, calldataload(add(assetDataOffset, 68)))
let idsLength := calldataload(offsetToIds) let idsLength := calldataload(idsOffset)
let idsLengthInBytes := mul(idsLength, 32) let idsLengthInBytes := mul(idsLength, 32)
calldatacopy( calldatacopy(
dataAreaPtr, dataAreaEndOffset,
offsetToIds, idsOffset,
add(idsLengthInBytes, 32) add(idsLengthInBytes, 32)
) )
dataAreaPtr := add(dataAreaPtr, add(idsLengthInBytes, 32)) dataAreaEndOffset := add(dataAreaEndOffset, add(idsLengthInBytes, 32))
// Store pointer to `values` (Table #3) // Store pointer to `values` (Table #3)
mstore(100, sub(dataAreaPtr, 4)) // Subtract 4 for `safeBatchTrasferFrom` selector
mstore(100, sub(dataAreaEndOffset, 4))
// Copy `values` from `assetData` (Table #2) to memory (Table #3) // Copy `values` from `assetData` (Table #2) to memory (Table #3)
let offsetToValues := add(offsetToParamsInAssetData, calldataload(add(assetDataOffset, 100))) let valuesOffset := add(paramsInAssetDataOffset, calldataload(add(assetDataOffset, 100)))
let valuesLength := calldataload(offsetToValues) let valuesLength := calldataload(valuesOffset)
let valuesLengthInBytes := mul(valuesLength, 32) let valuesLengthInBytes := mul(valuesLength, 32)
// Store length of `values` // Store length of `values`
mstore(dataAreaPtr, valuesLength) mstore(dataAreaEndOffset, valuesLength)
dataAreaPtr := add(dataAreaPtr, 32) dataAreaEndOffset := add(dataAreaEndOffset, 32)
// Scale and store elements of `values` // Scale and store elements of `values`
let valuesBegin := add(offsetToValues, 32) let valuesBegin := add(valuesOffset, 32)
let valuesEnd := add(valuesBegin, valuesLengthInBytes) let valuesEnd := add(valuesBegin, valuesLengthInBytes)
for { let currentValueOffset := valuesBegin } for { let currentValueOffset := valuesBegin }
lt(currentValueOffset, valuesEnd) lt(currentValueOffset, valuesEnd)
@ -223,24 +226,25 @@ contract ERC1155Proxy is
} }
// There was no overflow, store the scaled token value // There was no overflow, store the scaled token value
mstore(dataAreaPtr, currentValueScaled) mstore(dataAreaEndOffset, currentValueScaled)
dataAreaPtr := add(dataAreaPtr, 32) dataAreaEndOffset := add(dataAreaEndOffset, 32)
} }
// Store pointer to `data` (Table #3) // Store pointer to `data` (Table #3)
mstore(132, sub(dataAreaPtr, 4)) // Subtract 4 for `safeBatchTrasferFrom` selector
mstore(132, sub(dataAreaEndOffset, 4))
// Copy `data` from `assetData` (Table #2) to memory (Table #3) // Copy `data` from `assetData` (Table #2) to memory (Table #3)
let offsetToData := add(offsetToParamsInAssetData, calldataload(add(assetDataOffset, 132))) let dataOffset := add(paramsInAssetDataOffset, calldataload(add(assetDataOffset, 132)))
let dataLengthInBytes := calldataload(offsetToData) let dataLengthInBytes := calldataload(dataOffset)
let dataLengthInWords := div(add(dataLengthInBytes, 31), 32) let dataLengthInWords := div(add(dataLengthInBytes, 31), 32)
let dataLengthInBytesWordAligned := mul(dataLengthInWords, 32) let dataLengthInBytesWordAligned := mul(dataLengthInWords, 32)
calldatacopy( calldatacopy(
dataAreaPtr, dataAreaEndOffset,
offsetToData, dataOffset,
add(dataLengthInBytesWordAligned, 32) add(dataLengthInBytesWordAligned, 32)
) )
dataAreaPtr := add(dataAreaPtr, add(dataLengthInBytesWordAligned, 32)) dataAreaEndOffset := add(dataAreaEndOffset, add(dataLengthInBytesWordAligned, 32))
////////// STEP 3/3 - Execute Transfer ////////// ////////// STEP 3/3 - Execute Transfer //////////
// Load the address of the destination erc1155 contract from asset data (Table #2) // Load the address of the destination erc1155 contract from asset data (Table #2)
@ -257,7 +261,7 @@ contract ERC1155Proxy is
assetAddress, // call address of erc1155 asset assetAddress, // call address of erc1155 asset
0, // don't send any ETH 0, // don't send any ETH
0, // pointer to start of input 0, // pointer to start of input
dataAreaPtr, // length of input is the end of the Data Area (Table #3) dataAreaEndOffset, // length of input is the end of the Data Area (Table #3)
0, // write output over memory that won't be reused 0, // write output over memory that won't be reused
0 // don't copy output to memory 0 // don't copy output to memory
) )