Skip to content

Instantly share code, notes, and snippets.

View andreafspeziale's full-sized avatar

Andrea Francesco Speziale andreafspeziale

View GitHub Profile
@andreafspeziale
andreafspeziale / unpack.md
Created December 17, 2019 23:06
Unpack a concatenated dynamic size bytes
/**
 * @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
)
@andreafspeziale
andreafspeziale / forward.md
Last active December 17, 2019 23:07
The entry point of the Atomic Proxy Smart Contract
/**
 * @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.
@andreafspeziale
andreafspeziale / concatBytes.js
Created July 10, 2019 17:29
Solidity function which concatenates the bytes array items
/**
* @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;
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
  )
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;