/**
* @dev Returns an array of bytes from the concat of dynamic size bytes.
* @param data The concatenated bytes.
* @param sizes The size of each bytes.
*/
function unpack(
bytes memory data,
uint32[] memory sizes
)
/**
* @dev Unpack and forward a package of meta transactions based on provided signatures.
* @param packedSignature The concatenated meta transactions signed hashed messages.
* @param recipients The meta transactions recipients.
* @param txsValueField The meta transactions value fields.
* @param packedTxsDataField The concatenated meta transactions data fields.
* @param txsDataSizes The size of each meta transactions data field.
* @param salt The meta transactions salt.
* @param expiration The operation expiration timestamp.
This file contains 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
/** | |
* @dev Returns primitive bytes type from an array of bytes. | |
* @param items The bytes array. | |
*/ | |
function concatBytes(bytes[] memory items) | |
private | |
pure | |
returns(bytes memory) | |
{ | |
bytes memory data = items[0]; |
mapping (address => uint256) public replayNonce;
function metaApprove(address spender, uint256 value, uint256 nonce, uint256 reward, bytes signature) public returns (bool) {
require(spender != address(0));
bytes32 metaHash = metaApproveHash(spender,value,nonce,reward);
address signer = getSigner(metaHash,signature);
require(nonce == replayNonce[signer]);
replayNonce[signer]++;
function approve(address spender, uint256 value) public returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function _approve(address owner, address spender, uint256 value) internal {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = value;
This file contains 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
if (_rewardAmount > 0) { | |
// address 0 mean reward with ETH | |
if (_rewardTokenAddress == address(0)){ | |
// reward with ETH | |
msg.sender.transfer(_rewardAmount); | |
} else { | |
// reward token | |
require( | |
_rewardTokenAddress._safeTransfer( | |
msg.sender, |
function forward(
bytes memory _signedHashedMessage,
address _user,
address _recipient,
uint _transactionObjectValueField,
bytes memory _transactionObjectDataField,
address _rewardTokenAddress,
uint _rewardAmount
)
This file contains 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
const userProxyContractNonce = new BigNumber(await ProxyInstance.nonce.call(user)) | |
const messageToBeHashed = [ | |
ProxyInstance.address, | |
user, | |
TargetContractInstance.address, | |
web3.utils.toTwosComplement(userValueTransactionField), | |
userDataTransactionField, | |
AssetInstance.address, | |
web3.utils.toTwosComplement(REWARD_AMOUNT), |
function executeCall(
address _to,
uint256 _value,
bytes memory _data
)
internal
returns (bool success)
{
// solium-disable-next-line security/no-inline-assembly
function isSignerWhitelisted(
bytes32 _hashedMessage,
bytes memory _signedHashedMessage
)
internal
view
returns (bool)
{
bytes32 r;