Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 5 additions & 18 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,23 +1,10 @@
OWNER="0x490b97230d82c22b563c3f322470f643b305884e"
VERSION_SALT="0x004"
OWNER=""
VERSION_SALT="0x0004"
PRIVATE_KEY=""
ENTRYPOINT="0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"
RPC_80001="https://rpc.ankr.com/polygon_mumbai"
ETHERSCAN_URL_80001="https://api-testnet.polygonscan.com/api"
ETHERSCAN_KEY_80001=""
RPC_1442="https://rpc.public.zkevm-test.net"
RPC_84531="https://goerli.base.org"
ETHERSCAN_URL_84531="https://api-goerli.basescan.org/api"
ETHERSCAN_KEY_84531=""
RPC_420="https://goerli.optimism.io"
ETHERSCAN_URL_420=""
ETHERSCAN_KEY_420=""
RPC_421613="https://arbitrum-goerli.public.blastapi.io"
ETHERSCAN_URL_421613=""
ETHERSCAN_KEY_421613=""
RPC_5="https://rpc.ankr.com/eth_goerli"
ETHERSCAN_URL_5=""
ETHERSCAN_KEY_5=""
RPC_59140="https://rpc.goerli.linea.build"
ETHERSCAN_URL_59140=""
ETHERSCAN_KEY_59140=""
RPC_421613="https://rpc.goerli.arbitrum.gateway.fm"
RPC_5="https://eth-goerli.public.blastapi.io"
FEE_MANAGER="0x687f79f1bbc3591c541b25d3ce3a642e3c822909"
4 changes: 2 additions & 2 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@

### PermissiveFactory

`0x825762ccb52fefc37f6d702d83d42f0c571a3836`
`0xcd8d5f03e1f4c2d519a09bf171400b6125c66b7f`

### PermissiveAccount

`0xf0afdb27fc4579d1de23170c265a579c38f1c7c4`
`0x5552cb883b234173670130ff72985290be64afd4`

### FeeManager

Expand Down
8 changes: 5 additions & 3 deletions scripts/Deploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,16 @@ contract DeployScript is Script {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address entrypoint = vm.envAddress("ENTRYPOINT");
bytes32 versionSalt = vm.envBytes32("VERSION_SALT");
address feeManager = vm.envAddress("FEE_MANAGER");
vm.startBroadcast(deployerPrivateKey);
FeeManager feeManager = new FeeManager{salt: versionSalt}();
feeManager.initialize(vm.envAddress("OWNER"));
PermissiveAccount impl = new PermissiveAccount{salt: versionSalt}(
entrypoint,
payable(address(feeManager))
);
new PermissiveFactory{salt: versionSalt}(address(impl));
PermissiveFactory factory = new PermissiveFactory{salt: versionSalt}(
address(impl)
);
factory.initialize(vm.addr(deployerPrivateKey));
vm.stopBroadcast();
}
}
26 changes: 26 additions & 0 deletions scripts/Upgrade.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// SPDX-License-Indetifier: SEE LICENSE IN LICENSE

pragma solidity ^0.8.18;

import "forge-std/Script.sol";
import "../src/core/PermissiveFactory.sol";
import "../src/core/PermissiveAccount.sol";

contract UpgradeScript is Script {
function run() external {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address entrypoint = vm.envAddress("ENTRYPOINT");
bytes32 versionSalt = vm.envBytes32("VERSION_SALT");
address feeManager = vm.envAddress("FEE_MANAGER");
vm.startBroadcast(deployerPrivateKey);
PermissiveAccount impl = new PermissiveAccount{salt: versionSalt}(
entrypoint,
payable(address(feeManager))
);
PermissiveFactory(0x03Fc43A9124813720A14889bE92eE44A73c7b3ec).upgradeTo(
address(impl)
);
vm.addr(deployerPrivateKey);
vm.stopBroadcast();
}
}
16 changes: 8 additions & 8 deletions scripts/deploy_all.sh
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# polygon zkEVM
forge script --rpc-url $RPC_1442 --broadcast --sender $OWNER ./scripts/Deploy.s.sol
# base goerli
forge script --rpc-url $RPC_84531 --broadcast --sender $OWNER ./scripts/Deploy.s.sol
# optimism goerli
forge script --rpc-url $RPC_420 --broadcast --sender $OWNER ./scripts/Deploy.s.sol
# # polygon zkEVM
# forge script --rpc-url $RPC_1442 --broadcast --sender $OWNER ./scripts/Deploy.s.sol
# # base goerli
# forge script --rpc-url $RPC_84531 --broadcast --sender $OWNER ./scripts/Deploy.s.sol
# # optimism goerli
# forge script --rpc-url $RPC_420 --broadcast --sender $OWNER ./scripts/Deploy.s.sol
# arbitrum goerli
forge script --rpc-url $RPC_421613 --broadcast --sender $OWNER ./scripts/Deploy.s.sol
# goerli
forge script --rpc-url $RPC_5 --broadcast --sender $OWNER ./scripts/Deploy.s.sol
# # goerli
# forge script --rpc-url $RPC_5 --broadcast --sender $OWNER ./scripts/Deploy.s.sol
74 changes: 52 additions & 22 deletions src/core/AllowanceCalldata.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,22 @@ uint256 constant AND = 5;
uint256 constant OR = 6;

library AllowanceCalldata {
function sliceRLPItems(RLPReader.RLPItem[] memory arguments, uint256 start)
public
pure
returns (RLPReader.RLPItem[] memory newArguments)
{
function sliceRLPItems(
RLPReader.RLPItem[] memory arguments,
uint256 start
) public pure returns (RLPReader.RLPItem[] memory newArguments) {
uint256 length = arguments.length - start;
assembly {
newArguments := mload(0x40)
mstore(0x40, add(newArguments, 0x20))
mstore(newArguments, length)
let hit := mul(add(length, 1), 0x20)
let memStart := add(arguments, mul(start, 0x20))
for { let i := 0x20 } lt(i, hit) { i := add(i, 0x20) } {
for {
let i := 0x20
} lt(i, hit) {
i := add(i, 0x20)
} {
mstore(add(newArguments, i), mload(add(memStart, i)))
}
mstore(0x40, add(mload(0x40), mul(length, 0x20)))
Expand All @@ -39,11 +42,17 @@ library AllowanceCalldata {
) public view returns (bool canPass) {
if (allowedArguments.length == 0) return true;
for (uint256 i = 0; i < allowedArguments.length; i = unsafe_inc(i)) {
RLPReader.RLPItem[] memory prefixAndArg = RLPReader.toList(allowedArguments[i]);
RLPReader.RLPItem[] memory prefixAndArg = RLPReader.toList(
allowedArguments[i]
);
uint256 prefix = RLPReader.toUint(prefixAndArg[0]);

if (prefix == ANY) {} else if (prefix == EQ) {
bytes memory allowedArgument = RLPReader.toBytes(prefixAndArg[1]);
if (prefix == ANY) {
canPass = true;
} else if (prefix == EQ) {
bytes memory allowedArgument = RLPReader.toBytes(
prefixAndArg[1]
);
bytes memory argument = RLPReader.toBytes(arguments[i]);
canPass = keccak256(allowedArgument) == keccak256(argument);
} else if (prefix == LT) {
Expand All @@ -55,16 +64,30 @@ library AllowanceCalldata {
uint256 argument = RLPReader.toUint(arguments[i]);
canPass = argument > allowedArgument;
} else if (prefix == OR) {
RLPReader.RLPItem[] memory subAllowance = RLPReader.toList(prefixAndArg[1]);
canPass = validateArguments(subAllowance, sliceRLPItems(arguments, i), true);
RLPReader.RLPItem[] memory subAllowance = RLPReader.toList(
prefixAndArg[1]
);
canPass = validateArguments(
subAllowance,
sliceRLPItems(arguments, i),
true
);
i = unsafe_inc(i);
} else if (prefix == NE) {
bytes memory allowedArgument = RLPReader.toBytes(prefixAndArg[1]);
bytes memory allowedArgument = RLPReader.toBytes(
prefixAndArg[1]
);
bytes memory argument = RLPReader.toBytes(arguments[i]);
canPass = keccak256(allowedArgument) != keccak256(argument);
} else if (prefix == AND) {
RLPReader.RLPItem[] memory subAllowance = RLPReader.toList(prefixAndArg[1]);
canPass = validateArguments(subAllowance, sliceRLPItems(arguments, i), false);
RLPReader.RLPItem[] memory subAllowance = RLPReader.toList(
prefixAndArg[1]
);
canPass = validateArguments(
subAllowance,
sliceRLPItems(arguments, i),
false
);
i = unsafe_inc(i);
} else {
revert("Invalid calldata prefix");
Expand All @@ -76,13 +99,15 @@ library AllowanceCalldata {
return canPass;
}

function isAllowedCalldata(bytes memory allowed, bytes memory data, uint256 value)
internal
view
returns (bool isOk)
{
function isAllowedCalldata(
bytes memory allowed,
bytes memory data,
uint256 value
) internal view returns (bool isOk) {
RLPReader.RLPItem memory RLPAllowed = RLPReader.toRlpItem(allowed);
RLPReader.RLPItem[] memory allowedArguments = RLPReader.toList(RLPAllowed);
RLPReader.RLPItem[] memory allowedArguments = RLPReader.toList(
RLPAllowed
);
RLPReader.RLPItem memory RLPData = RLPReader.toRlpItem(data);
RLPReader.RLPItem[] memory arguments = RLPReader.toList(RLPData);
if (allowedArguments.length != arguments.length) {
Expand All @@ -94,11 +119,16 @@ library AllowanceCalldata {
isOk = validateArguments(allowedArguments, arguments, false);
}

function RLPtoABI(bytes memory data) internal pure returns (bytes memory abiEncoded) {
function RLPtoABI(
bytes memory data
) internal pure returns (bytes memory abiEncoded) {
RLPReader.RLPItem memory RLPData = RLPReader.toRlpItem(data);
RLPReader.RLPItem[] memory arguments = RLPReader.toList(RLPData);
for (uint256 i = 1; i < arguments.length; i = unsafe_inc(i)) {
abiEncoded = bytes.concat(abiEncoded, RLPReader.toBytes(arguments[i]));
abiEncoded = bytes.concat(
abiEncoded,
RLPReader.toBytes(arguments[i])
);
}
}

Expand Down
Loading