Compare commits
23 Commits
655cec97e0
...
openzeppel
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98dda3c61f | ||
|
|
4d1a24ecdf | ||
|
|
d9b93fe7d5 | ||
|
|
f56335d9b5 | ||
|
|
407ea51d6a | ||
|
|
e57428525b | ||
|
|
538258a709 | ||
|
|
30335bbe5b | ||
|
|
f924593ee2 | ||
|
|
811d5344a3 | ||
|
|
4f1f8d6025 | ||
|
|
c25fa24b2f | ||
|
|
4f63d17eb1 | ||
|
|
d27bdda15e | ||
|
|
1ffa9c6b5c | ||
|
|
f02dad07c8 | ||
|
|
db7407e299 | ||
|
|
e95828b7dd | ||
|
|
a3e6aa5879 | ||
|
|
f5f9923833 | ||
|
|
b571d6c47e | ||
|
|
95463cdfa3 | ||
|
|
1a91b64024 |
@@ -1,2 +0,0 @@
|
|||||||
extends:
|
|
||||||
- "@commitlint/config-conventional"
|
|
||||||
1
.husky/.gitignore
vendored
1
.husky/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
_
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
. "$(dirname "$0")/_/husky.sh"
|
|
||||||
|
|
||||||
yarn dlx commitlint --edit $1
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
. "$(dirname "$0")/_/husky.sh"
|
|
||||||
|
|
||||||
yarn dlx lint-staged
|
|
||||||
546
.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
vendored
546
.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
vendored
File diff suppressed because one or more lines are too long
786
.yarn/releases/yarn-3.2.1.cjs
vendored
786
.yarn/releases/yarn-3.2.1.cjs
vendored
File diff suppressed because one or more lines are too long
942
.yarn/releases/yarn-4.9.2.cjs
vendored
Executable file
942
.yarn/releases/yarn-4.9.2.cjs
vendored
Executable file
File diff suppressed because one or more lines are too long
10
.yarnrc.yml
10
.yarnrc.yml
@@ -1,7 +1,7 @@
|
|||||||
|
compressionLevel: mixed
|
||||||
|
|
||||||
|
enableGlobalCache: false
|
||||||
|
|
||||||
nodeLinker: node-modules
|
nodeLinker: node-modules
|
||||||
|
|
||||||
plugins:
|
yarnPath: .yarn/releases/yarn-4.9.2.cjs
|
||||||
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
|
|
||||||
spec: "@yarnpkg/plugin-interactive-tools"
|
|
||||||
|
|
||||||
yarnPath: .yarn/releases/yarn-3.2.1.cjs
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity 0.8.19;
|
pragma solidity ^0.8.19;
|
||||||
|
|
||||||
import { IReputation } from "./lib/interfaces/IReputation.sol";
|
import { IReputation } from "./lib/interfaces/IReputation.sol";
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity 0.8.19;
|
pragma solidity ^0.8.19;
|
||||||
|
|
||||||
import { ERC20, OwnerSettings } from "contracts/core/OwnerSettings.sol";
|
import { ERC20, OwnerSettings } from "contracts/core/OwnerSettings.sol";
|
||||||
|
|
||||||
import { ECDSA } from "contracts/lib/utils/ECDSA.sol";
|
import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
|
||||||
import { MerkleProofLib as Merkle } from "contracts/lib/utils/MerkleProofLib.sol";
|
import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
|
||||||
import { ReentrancyGuard } from "contracts/lib/utils/ReentrancyGuard.sol";
|
import { MerkleProof as Merkle } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
|
||||||
|
import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
|
||||||
|
|
||||||
abstract contract BaseUtils is
|
abstract contract BaseUtils is
|
||||||
OwnerSettings,
|
OwnerSettings,
|
||||||
@@ -43,8 +44,8 @@ abstract contract BaseUtils is
|
|||||||
if (
|
if (
|
||||||
!validBacenSigners(
|
!validBacenSigners(
|
||||||
_castAddrToKey(
|
_castAddrToKey(
|
||||||
ECDSA.recoverCalldata(
|
ECDSA.recover(
|
||||||
ECDSA.toEthSignedMessageHash(
|
MessageHashUtils.toEthSignedMessageHash(
|
||||||
_message
|
_message
|
||||||
),
|
),
|
||||||
_signature
|
_signature
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity 0.8.19;
|
pragma solidity ^0.8.19;
|
||||||
|
|
||||||
abstract contract Constants {
|
abstract contract Constants {
|
||||||
/// ███ Constants ██████████████████████████████████████████████████████████
|
/// ███ Constants ██████████████████████████████████████████████████████████
|
||||||
|
|||||||
@@ -1,30 +1,9 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity 0.8.19;
|
pragma solidity ^0.8.19;
|
||||||
|
|
||||||
import { ERC20 } from "contracts/lib/tokens/ERC20.sol";
|
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
||||||
|
|
||||||
library DataTypes {
|
library DataTypes {
|
||||||
struct DepositArgs {
|
|
||||||
string pixTarget;
|
|
||||||
bytes32 allowlistRoot;
|
|
||||||
ERC20 token;
|
|
||||||
uint96 amount;
|
|
||||||
bool valid;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct LockArgs {
|
|
||||||
address seller;
|
|
||||||
ERC20 token;
|
|
||||||
uint80 amount;
|
|
||||||
bytes32[] merkleProof;
|
|
||||||
uint256[] expiredLocks;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ReleaseArgs {
|
|
||||||
uint256 lockID;
|
|
||||||
bytes32 pixTimestamp;
|
|
||||||
bytes signature;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Lock {
|
struct Lock {
|
||||||
uint256 counter;
|
uint256 counter;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity 0.8.19;
|
pragma solidity ^0.8.19;
|
||||||
|
|
||||||
import { ERC20 } from "contracts/lib/tokens/ERC20.sol";
|
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
interface EventAndErrors {
|
interface EventAndErrors {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity 0.8.19;
|
pragma solidity ^0.8.19;
|
||||||
|
|
||||||
import { ERC2771Context as ERC2771 } from "contracts/lib/metatx/ERC2771Context.sol";
|
import { ERC2771 } from "contracts/lib/metatx/ERC2771Context.sol";
|
||||||
import { ERC20, SafeTransferLib } from "contracts/lib/utils/SafeTransferLib.sol";
|
import { ERC20, SafeTransferLib } from "contracts/lib/utils/SafeTransferLib.sol";
|
||||||
import { IReputation } from "contracts/lib/interfaces/IReputation.sol";
|
import { IReputation } from "contracts/lib/interfaces/IReputation.sol";
|
||||||
import { EventAndErrors } from "contracts/core/EventAndErrors.sol";
|
import { EventAndErrors } from "contracts/core/EventAndErrors.sol";
|
||||||
@@ -67,7 +67,7 @@ abstract contract OwnerSettings is
|
|||||||
sLoc := add(sLoc, 0x20)
|
sLoc := add(sLoc, 0x20)
|
||||||
} {
|
} {
|
||||||
// cache hashmap entry in scratch space
|
// cache hashmap entry in scratch space
|
||||||
mstore(0x20, isTrustedForwarder.slot)
|
mstore(0x20, trustedForwarders.slot)
|
||||||
mstore(0x00, mload(fLoc))
|
mstore(0x00, mload(fLoc))
|
||||||
// let mapSlot := keccak256(0x00, 0x40)
|
// let mapSlot := keccak256(0x00, 0x40)
|
||||||
sstore(keccak256(0x00, 0x40), mload(sLoc))
|
sstore(keccak256(0x00, 0x40), mload(sLoc))
|
||||||
|
|||||||
@@ -1,94 +1,14 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
pragma solidity >=0.8.4;
|
pragma solidity ^0.8.20;
|
||||||
|
|
||||||
/// @author OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
|
import { ERC2771Context } from "@openzeppelin/contracts/metatx/ERC2771Context.sol";
|
||||||
/// (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol)
|
|
||||||
|
|
||||||
/// @dev Provides information about the current execution context, including the
|
abstract contract ERC2771 is ERC2771Context(address(0)) {
|
||||||
/// sender of the transaction and its data. While these are generally available
|
mapping(address => bool) public trustedForwarders;
|
||||||
/// via msg.sender and msg.data, they should not be accessed in such a direct
|
|
||||||
/// manner, since when dealing with meta-transactions the account sending and
|
function isTrustedForwarder(address forwarder) public view override returns (bool) {
|
||||||
/// paying for execution may not be the actual sender (as far as an application
|
return trustedForwarders[forwarder];
|
||||||
/// is concerned).
|
|
||||||
///
|
|
||||||
/// This contract is only required for intermediate, library-like contracts.
|
|
||||||
abstract contract Context {
|
|
||||||
function _msgSender()
|
|
||||||
internal
|
|
||||||
view
|
|
||||||
virtual
|
|
||||||
returns (address)
|
|
||||||
{
|
|
||||||
return msg.sender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function _msgData()
|
|
||||||
internal
|
|
||||||
view
|
|
||||||
virtual
|
|
||||||
returns (bytes calldata)
|
|
||||||
{
|
|
||||||
return msg.data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @author Modified from OpenZeppelin Contracts (last updated v4.7.0) (metatx/ERC2771Context.sol)
|
|
||||||
/// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/metatx/ERC2771Context.sol
|
|
||||||
|
|
||||||
/// @dev Context variant with ERC2771 support.
|
|
||||||
abstract contract ERC2771Context is Context {
|
|
||||||
// address private immutable _trustedForwarder;
|
|
||||||
mapping(address => bool) public isTrustedForwarder;
|
|
||||||
|
|
||||||
/// @custom:oz-upgrades-unsafe-allow constructor
|
|
||||||
// constructor(address trustedForwarder) {
|
|
||||||
// _trustedForwarder = trustedForwarder;
|
|
||||||
// }
|
|
||||||
|
|
||||||
function _msgSender()
|
|
||||||
internal
|
|
||||||
view
|
|
||||||
virtual
|
|
||||||
override
|
|
||||||
returns (address sender)
|
|
||||||
{
|
|
||||||
if (isTrustedForwarder[msg.sender]) {
|
|
||||||
// The assembly code is more direct than the Solidity version using `abi.decode`.
|
|
||||||
/// @solidity memory-safe-assembly
|
|
||||||
assembly {
|
|
||||||
sender := shr(
|
|
||||||
96,
|
|
||||||
calldataload(sub(calldatasize(), 20))
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return super._msgSender();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _isTrustedForwarder()
|
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address _sender, uint256 _forwarder)
|
|
||||||
{
|
|
||||||
_sender = _msgSender();
|
|
||||||
_forwarder = (_sender != msg.sender)
|
|
||||||
? uint256(1)
|
|
||||||
: uint256(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _msgData()
|
|
||||||
internal
|
|
||||||
view
|
|
||||||
virtual
|
|
||||||
override
|
|
||||||
returns (bytes calldata)
|
|
||||||
{
|
|
||||||
if (isTrustedForwarder[msg.sender]) {
|
|
||||||
return msg.data[:msg.data.length - 20];
|
|
||||||
} else {
|
|
||||||
return super._msgData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity 0.8.19;
|
pragma solidity ^0.8.19;
|
||||||
|
|
||||||
import { ERC20 } from "../tokens/ERC20.sol";
|
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
||||||
|
|
||||||
contract MockToken is ERC20 {
|
contract MockToken is ERC20 {
|
||||||
constructor(uint256 supply) ERC20("MockBRL", "MBRL", 18) {
|
constructor(uint256 supply) ERC20("MockBRL", "MBRL") {
|
||||||
_mint(msg.sender, supply);
|
_mint(msg.sender, supply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,250 +0,0 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
|
||||||
pragma solidity >=0.8.4;
|
|
||||||
|
|
||||||
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
|
|
||||||
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
|
|
||||||
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
|
|
||||||
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
|
|
||||||
abstract contract ERC20 {
|
|
||||||
/*//////////////////////////////////////////////////////////////
|
|
||||||
EVENTS
|
|
||||||
//////////////////////////////////////////////////////////////*/
|
|
||||||
|
|
||||||
event Transfer(
|
|
||||||
address indexed from,
|
|
||||||
address indexed to,
|
|
||||||
uint256 amount
|
|
||||||
);
|
|
||||||
|
|
||||||
event Approval(
|
|
||||||
address indexed owner,
|
|
||||||
address indexed spender,
|
|
||||||
uint256 amount
|
|
||||||
);
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////
|
|
||||||
METADATA STORAGE
|
|
||||||
//////////////////////////////////////////////////////////////*/
|
|
||||||
|
|
||||||
string public name;
|
|
||||||
|
|
||||||
string public symbol;
|
|
||||||
|
|
||||||
uint8 public immutable decimals;
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////
|
|
||||||
ERC20 STORAGE
|
|
||||||
//////////////////////////////////////////////////////////////*/
|
|
||||||
|
|
||||||
uint256 public totalSupply;
|
|
||||||
|
|
||||||
mapping(address => uint256) public balanceOf;
|
|
||||||
|
|
||||||
mapping(address => mapping(address => uint256))
|
|
||||||
public allowance;
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////
|
|
||||||
EIP-2612 STORAGE
|
|
||||||
//////////////////////////////////////////////////////////////*/
|
|
||||||
|
|
||||||
uint256 internal immutable INITIAL_CHAIN_ID;
|
|
||||||
|
|
||||||
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
|
|
||||||
|
|
||||||
mapping(address => uint256) public nonces;
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////
|
|
||||||
CONSTRUCTOR
|
|
||||||
//////////////////////////////////////////////////////////////*/
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
string memory _name,
|
|
||||||
string memory _symbol,
|
|
||||||
uint8 _decimals
|
|
||||||
) {
|
|
||||||
name = _name;
|
|
||||||
symbol = _symbol;
|
|
||||||
decimals = _decimals;
|
|
||||||
|
|
||||||
INITIAL_CHAIN_ID = block.chainid;
|
|
||||||
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////
|
|
||||||
ERC20 LOGIC
|
|
||||||
//////////////////////////////////////////////////////////////*/
|
|
||||||
|
|
||||||
function approve(
|
|
||||||
address spender,
|
|
||||||
uint256 amount
|
|
||||||
) public virtual returns (bool) {
|
|
||||||
allowance[msg.sender][spender] = amount;
|
|
||||||
|
|
||||||
emit Approval(msg.sender, spender, amount);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function transfer(
|
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
) public virtual returns (bool) {
|
|
||||||
balanceOf[msg.sender] -= amount;
|
|
||||||
|
|
||||||
// Cannot overflow because the sum of all user
|
|
||||||
// balances can't exceed the max uint256 value.
|
|
||||||
unchecked {
|
|
||||||
balanceOf[to] += amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit Transfer(msg.sender, to, amount);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function transferFrom(
|
|
||||||
address from,
|
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
) public virtual returns (bool) {
|
|
||||||
uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
|
|
||||||
|
|
||||||
if (allowed != type(uint256).max)
|
|
||||||
allowance[from][msg.sender] = allowed - amount;
|
|
||||||
|
|
||||||
balanceOf[from] -= amount;
|
|
||||||
|
|
||||||
// Cannot overflow because the sum of all user
|
|
||||||
// balances can't exceed the max uint256 value.
|
|
||||||
unchecked {
|
|
||||||
balanceOf[to] += amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit Transfer(from, to, amount);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////
|
|
||||||
EIP-2612 LOGIC
|
|
||||||
//////////////////////////////////////////////////////////////*/
|
|
||||||
|
|
||||||
function permit(
|
|
||||||
address owner,
|
|
||||||
address spender,
|
|
||||||
uint256 value,
|
|
||||||
uint256 deadline,
|
|
||||||
uint8 v,
|
|
||||||
bytes32 r,
|
|
||||||
bytes32 s
|
|
||||||
) public virtual {
|
|
||||||
require(
|
|
||||||
deadline >= block.timestamp,
|
|
||||||
"PERMIT_DEADLINE_EXPIRED"
|
|
||||||
);
|
|
||||||
|
|
||||||
// Unchecked because the only math done is incrementing
|
|
||||||
// the owner's nonce which cannot realistically overflow.
|
|
||||||
unchecked {
|
|
||||||
address recoveredAddress = ecrecover(
|
|
||||||
keccak256(
|
|
||||||
abi.encodePacked(
|
|
||||||
"\x19\x01",
|
|
||||||
DOMAIN_SEPARATOR(),
|
|
||||||
keccak256(
|
|
||||||
abi.encode(
|
|
||||||
keccak256(
|
|
||||||
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
|
|
||||||
),
|
|
||||||
owner,
|
|
||||||
spender,
|
|
||||||
value,
|
|
||||||
nonces[owner]++,
|
|
||||||
deadline
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
v,
|
|
||||||
r,
|
|
||||||
s
|
|
||||||
);
|
|
||||||
|
|
||||||
require(
|
|
||||||
recoveredAddress != address(0) &&
|
|
||||||
recoveredAddress == owner,
|
|
||||||
"INVALID_SIGNER"
|
|
||||||
);
|
|
||||||
|
|
||||||
allowance[recoveredAddress][spender] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit Approval(owner, spender, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
function DOMAIN_SEPARATOR()
|
|
||||||
public
|
|
||||||
view
|
|
||||||
virtual
|
|
||||||
returns (bytes32)
|
|
||||||
{
|
|
||||||
return
|
|
||||||
block.chainid == INITIAL_CHAIN_ID
|
|
||||||
? INITIAL_DOMAIN_SEPARATOR
|
|
||||||
: computeDomainSeparator();
|
|
||||||
}
|
|
||||||
|
|
||||||
function computeDomainSeparator()
|
|
||||||
internal
|
|
||||||
view
|
|
||||||
virtual
|
|
||||||
returns (bytes32)
|
|
||||||
{
|
|
||||||
return
|
|
||||||
keccak256(
|
|
||||||
abi.encode(
|
|
||||||
keccak256(
|
|
||||||
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
|
|
||||||
),
|
|
||||||
keccak256(bytes(name)),
|
|
||||||
keccak256("1"),
|
|
||||||
block.chainid,
|
|
||||||
address(this)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////
|
|
||||||
INTERNAL MINT/BURN LOGIC
|
|
||||||
//////////////////////////////////////////////////////////////*/
|
|
||||||
|
|
||||||
function _mint(
|
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
) internal virtual {
|
|
||||||
totalSupply += amount;
|
|
||||||
|
|
||||||
// Cannot overflow because the sum of all user
|
|
||||||
// balances can't exceed the max uint256 value.
|
|
||||||
unchecked {
|
|
||||||
balanceOf[to] += amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit Transfer(address(0), to, amount);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _burn(
|
|
||||||
address from,
|
|
||||||
uint256 amount
|
|
||||||
) internal virtual {
|
|
||||||
balanceOf[from] -= amount;
|
|
||||||
|
|
||||||
// Cannot underflow because a user's balance
|
|
||||||
// will never be larger than the total supply.
|
|
||||||
unchecked {
|
|
||||||
totalSupply -= amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit Transfer(from, address(0), amount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
|
||||||
pragma solidity >=0.8.4;
|
|
||||||
|
|
||||||
/// @notice Gas optimized ECDSA wrapper.
|
|
||||||
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ECDSA.sol)
|
|
||||||
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ECDSA.sol)
|
|
||||||
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol)
|
|
||||||
library ECDSA {
|
|
||||||
/// @dev The signature is invalid.
|
|
||||||
error InvalidSignature();
|
|
||||||
|
|
||||||
/// @dev The number which `s` must not exceed in order for
|
|
||||||
/// the signature to be non-malleable.
|
|
||||||
bytes32 private constant _MALLEABILITY_THRESHOLD =
|
|
||||||
0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0;
|
|
||||||
|
|
||||||
/// @dev Recovers the signer's address from a message digest `hash`,
|
|
||||||
/// and the `signature`.
|
|
||||||
///
|
|
||||||
/// This function does NOT accept EIP-2098 short form signatures.
|
|
||||||
/// Use `recover(bytes32 hash, bytes32 r, bytes32 vs)` for EIP-2098
|
|
||||||
/// short form signatures instead.
|
|
||||||
function recoverCalldata(
|
|
||||||
bytes32 hash,
|
|
||||||
bytes calldata signature
|
|
||||||
) internal view returns (address result) {
|
|
||||||
/// @solidity memory-safe-assembly
|
|
||||||
assembly {
|
|
||||||
// Copy the free memory pointer so that we can restore it later.
|
|
||||||
let m := mload(0x40)
|
|
||||||
// Directly copy `r` and `s` from the calldata.
|
|
||||||
calldatacopy(0x40, signature.offset, 0x40)
|
|
||||||
// Store the `hash` in the scratch space.
|
|
||||||
mstore(0x00, hash)
|
|
||||||
// Compute `v` and store it in the scratch space.
|
|
||||||
mstore(
|
|
||||||
0x20,
|
|
||||||
byte(
|
|
||||||
0,
|
|
||||||
calldataload(add(signature.offset, 0x40))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
pop(
|
|
||||||
staticcall(
|
|
||||||
gas(), // Amount of gas left for the transaction.
|
|
||||||
and(
|
|
||||||
// If the signature is exactly 65 bytes in length.
|
|
||||||
eq(signature.length, 65),
|
|
||||||
// If `s` in lower half order, such that the signature is not malleable.
|
|
||||||
lt(
|
|
||||||
mload(0x60),
|
|
||||||
add(_MALLEABILITY_THRESHOLD, 1)
|
|
||||||
)
|
|
||||||
), // Address of `ecrecover`.
|
|
||||||
0x00, // Start of input.
|
|
||||||
0x80, // Size of input.
|
|
||||||
0x00, // Start of output.
|
|
||||||
0x20 // Size of output.
|
|
||||||
)
|
|
||||||
)
|
|
||||||
result := mload(0x00)
|
|
||||||
// `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
|
|
||||||
if iszero(returndatasize()) {
|
|
||||||
// Store the function selector of `InvalidSignature()`.
|
|
||||||
mstore(0x00, 0x8baa579f)
|
|
||||||
// Revert with (offset, size).
|
|
||||||
revert(0x1c, 0x04)
|
|
||||||
}
|
|
||||||
// Restore the zero slot.
|
|
||||||
mstore(0x60, 0)
|
|
||||||
// Restore the free memory pointer.
|
|
||||||
mstore(0x40, m)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @dev Returns an Ethereum Signed Message, created from a `hash`.
|
|
||||||
/// This produces a hash corresponding to the one signed with the
|
|
||||||
/// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)
|
|
||||||
/// JSON-RPC method as part of EIP-191.
|
|
||||||
function toEthSignedMessageHash(
|
|
||||||
bytes32 hash
|
|
||||||
) internal pure returns (bytes32 result) {
|
|
||||||
/// @solidity memory-safe-assembly
|
|
||||||
assembly {
|
|
||||||
// Store into scratch space for keccak256.
|
|
||||||
mstore(0x20, hash)
|
|
||||||
mstore(
|
|
||||||
0x00,
|
|
||||||
"\x00\x00\x00\x00\x19Ethereum Signed Message:\n32"
|
|
||||||
)
|
|
||||||
// 0x40 - 0x04 = 0x3c
|
|
||||||
result := keccak256(0x04, 0x3c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
|
||||||
pragma solidity >=0.8.4;
|
|
||||||
|
|
||||||
/// @notice Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.
|
|
||||||
/// @author Solady
|
|
||||||
/// (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)
|
|
||||||
/// @author Modified from Solmate
|
|
||||||
/// (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)
|
|
||||||
/// @author Modified from OpenZeppelin
|
|
||||||
/// (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)
|
|
||||||
library MerkleProofLib {
|
|
||||||
/// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.
|
|
||||||
function verify(
|
|
||||||
bytes32[] calldata proof,
|
|
||||||
bytes32 root,
|
|
||||||
bytes32 leaf
|
|
||||||
) internal pure returns (bool isValid) {
|
|
||||||
/// @solidity memory-safe-assembly
|
|
||||||
assembly {
|
|
||||||
if proof.length {
|
|
||||||
// Left shift by 5 is equivalent to multiplying by 0x20.
|
|
||||||
let end := add(
|
|
||||||
proof.offset,
|
|
||||||
shl(5, proof.length)
|
|
||||||
)
|
|
||||||
// Initialize `offset` to the offset of `proof` in the calldata.
|
|
||||||
let offset := proof.offset
|
|
||||||
// Iterate over proof elements to compute root hash.
|
|
||||||
for {
|
|
||||||
|
|
||||||
} 1 {
|
|
||||||
|
|
||||||
} {
|
|
||||||
// Slot of `leaf` in scratch space.
|
|
||||||
// If the condition is true: 0x20, otherwise: 0x00.
|
|
||||||
let scratch := shl(
|
|
||||||
5,
|
|
||||||
gt(leaf, calldataload(offset))
|
|
||||||
)
|
|
||||||
// Store elements to hash contiguously in scratch space.
|
|
||||||
// Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.
|
|
||||||
mstore(scratch, leaf)
|
|
||||||
mstore(
|
|
||||||
xor(scratch, 0x20),
|
|
||||||
calldataload(offset)
|
|
||||||
)
|
|
||||||
// Reuse `leaf` to store the hash to reduce stack operations.
|
|
||||||
leaf := keccak256(0x00, 0x40)
|
|
||||||
offset := add(offset, 0x20)
|
|
||||||
if iszero(lt(offset, end)) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
isValid := eq(leaf, root)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
|
||||||
pragma solidity >=0.8.4;
|
|
||||||
|
|
||||||
/// @notice Reentrancy protection for smart contracts.
|
|
||||||
/// @author z0r0z.eth
|
|
||||||
/// @author Modified from Seaport
|
|
||||||
/// (https://github.com/ProjectOpenSea/seaport/blob/main/contracts/lib/ReentrancyGuard.sol)
|
|
||||||
/// @author Modified from Solmate
|
|
||||||
/// (https://github.com/Rari-Capital/solmate/blob/main/src/utils/ReentrancyGuard.sol)
|
|
||||||
abstract contract ReentrancyGuard {
|
|
||||||
error Reentrancy();
|
|
||||||
|
|
||||||
uint256 private guard = 1;
|
|
||||||
|
|
||||||
modifier nonReentrant() virtual {
|
|
||||||
setReentrancyGuard();
|
|
||||||
|
|
||||||
_;
|
|
||||||
|
|
||||||
clearReentrancyGuard();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @dev Check guard sentinel value and set it.
|
|
||||||
function setReentrancyGuard() internal virtual {
|
|
||||||
if (guard == 2) revert Reentrancy();
|
|
||||||
|
|
||||||
guard = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @dev Unset sentinel value.
|
|
||||||
function clearReentrancyGuard() internal virtual {
|
|
||||||
guard = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity >=0.8.4;
|
pragma solidity >=0.8.4;
|
||||||
|
|
||||||
import { ERC20 } from "../tokens/ERC20.sol";
|
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
||||||
|
|
||||||
/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
|
/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
|
||||||
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol)
|
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity 0.8.19;
|
pragma solidity ^0.8.19;
|
||||||
|
|
||||||
/// ______ __
|
/// ______ __
|
||||||
/// .-----.|__ |.-----.|__|.--.--.
|
/// .-----.|__ |.-----.|__|.--.--.
|
||||||
@@ -18,14 +18,9 @@ contract P2PIX is BaseUtils {
|
|||||||
// solhint-disable no-inline-assembly
|
// solhint-disable no-inline-assembly
|
||||||
// solhint-disable no-empty-blocks
|
// solhint-disable no-empty-blocks
|
||||||
|
|
||||||
using DT for DT.DepositArgs;
|
|
||||||
using DT for DT.LockArgs;
|
|
||||||
using DT for DT.ReleaseArgs;
|
|
||||||
using DT for DT.Lock;
|
using DT for DT.Lock;
|
||||||
using DT for DT.LockStatus;
|
using DT for DT.LockStatus;
|
||||||
|
|
||||||
/// ███ Storage ████████████████████████████████████████████████████████████
|
|
||||||
|
|
||||||
uint256 public lockCounter;
|
uint256 public lockCounter;
|
||||||
|
|
||||||
/// @dev List of Locks.
|
/// @dev List of Locks.
|
||||||
@@ -33,8 +28,6 @@ contract P2PIX is BaseUtils {
|
|||||||
/// @dev Stores an relayer's last computed credit.
|
/// @dev Stores an relayer's last computed credit.
|
||||||
mapping(uint256 => uint256) public userRecord;
|
mapping(uint256 => uint256) public userRecord;
|
||||||
|
|
||||||
/// ███ Constructor ████████████████████████████████████████████████████████
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
uint256 defaultBlocks,
|
uint256 defaultBlocks,
|
||||||
address[] memory validSigners,
|
address[] memory validSigners,
|
||||||
@@ -51,60 +44,58 @@ contract P2PIX is BaseUtils {
|
|||||||
)
|
)
|
||||||
payable {/* */}
|
payable {/* */}
|
||||||
|
|
||||||
/// ███ Public FX ██████████████████████████████████████████████████████████
|
|
||||||
|
|
||||||
/// @notice Creates a deposit order based on a seller's
|
/// @notice Creates a deposit order based on a seller's
|
||||||
/// offer of an amount of ERC20 tokens.
|
/// offer of an amount of ERC20 tokens.
|
||||||
/// @dev Seller needs to send his tokens to the P2PIX smart contract.
|
/// @notice Seller needs to send his tokens to the P2PIX smart contract.
|
||||||
/* /// @param _pixTarget Pix key destination provided by the offer's seller. */
|
/// @param pixTarget Pix key destination provided by the offer's seller.
|
||||||
/* /// @param allowlistRoot Optional allow list merkleRoot update `bytes32` value. */
|
/// @param allowlistRoot Optional allow list merkleRoot update `bytes32` value.
|
||||||
/* /// as the deposit identifier. */
|
/// as the deposit identifier.
|
||||||
/// @dev Function sighash: 0xbfe07da6.
|
/// @dev Function sighash: 0x5e918943
|
||||||
function deposit(
|
function deposit(
|
||||||
DT.DepositArgs calldata args
|
string calldata pixTarget,
|
||||||
) public {
|
bytes32 allowlistRoot,
|
||||||
|
ERC20 token,
|
||||||
|
uint96 amount,
|
||||||
|
bool valid
|
||||||
|
) public nonReentrant {
|
||||||
|
|
||||||
if (bytes(args.pixTarget).length == 0) revert EmptyPixTarget();
|
if (bytes(pixTarget).length == 0) revert EmptyPixTarget();
|
||||||
if (!allowedERC20s(args.token)) revert TokenDenied();
|
if (!allowedERC20s(token)) revert TokenDenied();
|
||||||
uint256 _sellerBalance = __sellerBalance(msg.sender, args.token);
|
uint256 _sellerBalance = __sellerBalance(msg.sender, token);
|
||||||
|
|
||||||
uint256 currBal = _sellerBalance & BITMASK_SB_ENTRY;
|
uint256 currBal = _sellerBalance & BITMASK_SB_ENTRY;
|
||||||
uint256 _newBal = uint256(currBal + args.amount);
|
uint256 _newBal = uint256(currBal + amount);
|
||||||
if (_newBal > MAXBALANCE_UPPERBOUND)
|
if (_newBal > MAXBALANCE_UPPERBOUND)
|
||||||
revert MaxBalExceeded();
|
revert MaxBalExceeded();
|
||||||
|
|
||||||
setReentrancyGuard();
|
if (allowlistRoot != 0) {
|
||||||
|
setRoot(msg.sender, allowlistRoot);
|
||||||
if (args.allowlistRoot != 0) {
|
|
||||||
setRoot(msg.sender, args.allowlistRoot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes32 pixTargetCasted = getStr(args.pixTarget);
|
bytes32 pixTargetCasted = getStr(pixTarget);
|
||||||
uint256 validCasted = _castBool(args.valid);
|
uint256 validCasted = _castBool(valid);
|
||||||
|
|
||||||
_setSellerBalance(
|
_setSellerBalance(
|
||||||
msg.sender,
|
msg.sender,
|
||||||
args.token,
|
token,
|
||||||
(_newBal | (validCasted << BITPOS_VALID)),
|
(_newBal | (validCasted << BITPOS_VALID)),
|
||||||
pixTargetCasted
|
pixTargetCasted
|
||||||
);
|
);
|
||||||
|
|
||||||
SafeTransferLib.safeTransferFrom(
|
SafeTransferLib.safeTransferFrom(
|
||||||
args.token,
|
token,
|
||||||
msg.sender,
|
msg.sender,
|
||||||
address(this),
|
address(this),
|
||||||
args.amount
|
amount
|
||||||
);
|
);
|
||||||
|
|
||||||
clearReentrancyGuard();
|
emit DepositAdded(msg.sender, token, amount);
|
||||||
|
|
||||||
emit DepositAdded(msg.sender, args.token, args.amount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @notice Enables seller to invalidate future
|
/// @notice Enables seller to invalidate future
|
||||||
/// locks made to his/her token offering order.
|
/// locks made to his/her token offering order.
|
||||||
/// @dev This function does not affect any ongoing active locks.
|
/// @notice This function does not affect any ongoing active locks.
|
||||||
/// @dev Function sighash: 0x72fada5c.
|
/// @dev Function sighash: 0x6d82d9e0
|
||||||
function setValidState(ERC20 token, bool state) public {
|
function setValidState(ERC20 token, bool state) public {
|
||||||
uint256 _sellerBalance = __sellerBalance(msg.sender, token);
|
uint256 _sellerBalance = __sellerBalance(msg.sender, token);
|
||||||
|
|
||||||
@@ -123,89 +114,94 @@ contract P2PIX is BaseUtils {
|
|||||||
|
|
||||||
/// @notice Public method designed to lock an remaining amount of
|
/// @notice Public method designed to lock an remaining amount of
|
||||||
/// the deposit order of a seller.
|
/// the deposit order of a seller.
|
||||||
/// @dev Transaction forwarding must leave `merkleProof` empty;
|
/// @notice Transaction forwarding must leave `merkleProof` empty;
|
||||||
/// otherwise, the trustedForwarder must be previously added
|
/// otherwise, the trustedForwarder must be previously added
|
||||||
/// to a seller whitelist.
|
/// to a seller whitelist.
|
||||||
/// @dev This method can be performed either by:
|
/// @notice This method can be performed either by:
|
||||||
/// - An user allowed via the seller's allowlist;
|
/// - An user allowed via the seller's allowlist;
|
||||||
/// - An user with enough userRecord to lock the wished amount;
|
/// - An user with enough userRecord to lock the wished amount;
|
||||||
/// @dev There can only exist a lock per each `_amount` partitioned
|
/// @notice There can only exist a lock per each `amount` partitioned
|
||||||
/// from the total `remaining` value.
|
/// from the total `remaining` value.
|
||||||
/// @dev Locks can only be performed in valid orders.
|
/// @notice Locks can only be performed in valid orders.
|
||||||
/* /// @param _amount The deposit's remaining amount wished to be locked. */
|
/// @param amount The deposit's remaining amount wished to be locked.
|
||||||
/* /// @param merkleProof This value should be: */
|
/// @param merkleProof Provided as a pass if the `msg.sender` is in the
|
||||||
/* /// - Provided as a pass if the `msg.sender` is in the seller's allowlist; */
|
/// seller's allowlist; Left empty otherwise;
|
||||||
/* /// - Left empty otherwise; */
|
/// @param expiredLocks An array of identifiers to be
|
||||||
/* /// @param expiredLocks An array of `bytes32` identifiers to be */
|
/// provided so to unexpire locks using this transaction gas push.
|
||||||
/* /// provided so to unexpire locks using this transaction gas push. */
|
/// @return lockID The lock identifier.
|
||||||
/// @return lockID The `bytes32` value returned as the lock identifier.
|
/// @dev Function sighash: 0xdc43221c
|
||||||
/// @dev Function sighash: 0x03aaf306.
|
|
||||||
function lock(
|
function lock(
|
||||||
DT.LockArgs calldata args
|
address seller,
|
||||||
|
ERC20 token,
|
||||||
|
uint80 amount,
|
||||||
|
bytes32[] calldata merkleProof,
|
||||||
|
uint256[] calldata expiredLocks
|
||||||
) public nonReentrant returns (uint256 lockID) {
|
) public nonReentrant returns (uint256 lockID) {
|
||||||
unlockExpired(args.expiredLocks);
|
unlockExpired(expiredLocks);
|
||||||
|
|
||||||
if (!getValid(args.seller, args.token)) revert InvalidDeposit();
|
if (!getValid(seller, token)) revert InvalidDeposit();
|
||||||
|
|
||||||
uint256 bal = getBalance(args.seller, args.token);
|
uint256 bal = getBalance(seller, token);
|
||||||
if (bal < args.amount) revert NotEnoughTokens();
|
if (bal < amount) revert NotEnoughTokens();
|
||||||
|
|
||||||
uint256 c = lockCounter + 1;
|
unchecked {
|
||||||
|
lockID = ++lockCounter;
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
mapLocks[c].expirationBlock >= block.number
|
mapLocks[lockID].expirationBlock >= block.number
|
||||||
) revert NotExpired();
|
) revert NotExpired();
|
||||||
|
|
||||||
address sender; uint256 forwarder;
|
bytes32 _pixTarget = getPixTarget(seller, token);
|
||||||
(sender, forwarder) = _isTrustedForwarder();
|
|
||||||
bytes32 _pixTarget = getPixTarget(args.seller, args.token);
|
|
||||||
|
|
||||||
// transaction forwarding must leave `merkleProof` empty;
|
// transaction forwarding must leave `merkleProof` empty;
|
||||||
// otherwise, the trustedForwarder must be previously added
|
// otherwise, the trustedForwarder must be previously added
|
||||||
// to a seller whitelist.
|
// to a seller whitelist.
|
||||||
if (args.merkleProof.length != 0) {
|
if (merkleProof.length != 0) {
|
||||||
_merkleVerify( args.merkleProof, sellerAllowList(args.seller), sender);
|
_merkleVerify( merkleProof, sellerAllowList(seller), _msgSender());
|
||||||
|
|
||||||
} else if (args.amount > REPUTATION_LOWERBOUND && forwarder == 0) {
|
} else if ( amount > REPUTATION_LOWERBOUND && msg.sender == _msgSender() ) {
|
||||||
|
|
||||||
uint256 spendLimit; uint256 userCredit =
|
uint256 spendLimit; uint256 userCredit =
|
||||||
userRecord[_castAddrToKey(msg.sender)];
|
userRecord[_castAddrToKey(_msgSender())];
|
||||||
(spendLimit) = _limiter(userCredit / WAD);
|
(spendLimit) = _limiter(userCredit / WAD);
|
||||||
if (
|
if (
|
||||||
args.amount > (spendLimit * WAD) ||
|
amount > (spendLimit * WAD) ||
|
||||||
args.amount > LOCKAMOUNT_UPPERBOUND
|
amount > LOCKAMOUNT_UPPERBOUND
|
||||||
) revert AmountNotAllowed();
|
) revert AmountNotAllowed();
|
||||||
}
|
}
|
||||||
|
|
||||||
DT.Lock memory l = DT.Lock(
|
DT.Lock memory l = DT.Lock(
|
||||||
c,
|
lockID,
|
||||||
(block.number + defaultLockBlocks),
|
(block.number + defaultLockBlocks),
|
||||||
_pixTarget,
|
_pixTarget,
|
||||||
args.amount,
|
amount,
|
||||||
args.token,
|
token,
|
||||||
sender,
|
_msgSender(),
|
||||||
args.seller
|
seller
|
||||||
);
|
);
|
||||||
|
|
||||||
lockID = _addLock(bal, l);
|
_addLock(bal, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @notice Lock release method that liquidate lock
|
/// @notice Lock release method that liquidate lock
|
||||||
/// orders and distributes relayer fees.
|
/// orders and distributes relayer fees.
|
||||||
/// @dev This method can be called by any public actor
|
/// @notice This method can be called by any public actor
|
||||||
/// as long the signature provided is valid.
|
/// as long the signature provided is valid.
|
||||||
/// @dev `relayerPremium` gets splitted equaly
|
/// @notice `relayerPremium` gets splitted equaly
|
||||||
/// if relayer addresses differ.
|
/// if relayer addresses differ.
|
||||||
/// @dev If the `msg.sender` of this method and `l.relayerAddress` are the same,
|
/// @notice If the `msg.sender` of this method and `l.relayerAddress` are the same,
|
||||||
/// `msg.sender` accrues both l.amount and l.relayerPremium as userRecord credit.
|
/// `msg.sender` accrues both l.amount and l.relayerPremium as userRecord credit.
|
||||||
/// In case of they differing:
|
/// In case of they differing:
|
||||||
/// - `lock` caller gets accrued with `l.amount` as userRecord credit;
|
/// - `lock` caller gets accrued with `l.amount` as userRecord credit;
|
||||||
/// - `release` caller gets accrued with `l.relayerPremium` as userRecord credit;
|
/// - `release` caller gets accrued with `l.relayerPremium` as userRecord credit;
|
||||||
/// @dev Function sighash: 0x4e1389ed.
|
/// @dev Function sighash: 0x11fc7f9a
|
||||||
function release(
|
function release(
|
||||||
DT.ReleaseArgs calldata args
|
uint256 lockID,
|
||||||
|
bytes32 pixTimestamp,
|
||||||
|
bytes calldata signature
|
||||||
) public nonReentrant {
|
) public nonReentrant {
|
||||||
DT.Lock storage l = mapLocks[args.lockID];
|
DT.Lock storage l = mapLocks[lockID];
|
||||||
|
|
||||||
if (l.amount == 0) revert AlreadyReleased();
|
if (l.amount == 0) revert AlreadyReleased();
|
||||||
if (l.expirationBlock < block.number)
|
if (l.expirationBlock < block.number)
|
||||||
@@ -215,11 +211,11 @@ contract P2PIX is BaseUtils {
|
|||||||
abi.encodePacked(
|
abi.encodePacked(
|
||||||
l.pixTarget,
|
l.pixTarget,
|
||||||
l.amount,
|
l.amount,
|
||||||
args.pixTimestamp
|
pixTimestamp
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
_signerCheck(message, args.signature);
|
_signerCheck(message, signature);
|
||||||
|
|
||||||
ERC20 t = ERC20(l.token);
|
ERC20 t = ERC20(l.token);
|
||||||
|
|
||||||
@@ -230,10 +226,7 @@ contract P2PIX is BaseUtils {
|
|||||||
l.expirationBlock = 0;
|
l.expirationBlock = 0;
|
||||||
_setUsedTransactions(message);
|
_setUsedTransactions(message);
|
||||||
|
|
||||||
address sender; uint256 forwarder;
|
if (_msgSender() == msg.sender) {
|
||||||
(sender, forwarder) = _isTrustedForwarder();
|
|
||||||
|
|
||||||
if (forwarder == 0) {
|
|
||||||
if (msg.sender != l.buyerAddress) {
|
if (msg.sender != l.buyerAddress) {
|
||||||
userRecord[_castAddrToKey(msg.sender)] += (lockAmount >> 1);
|
userRecord[_castAddrToKey(msg.sender)] += (lockAmount >> 1);
|
||||||
userRecord[_castAddrToKey(l.buyerAddress)] += (lockAmount >> 1);
|
userRecord[_castAddrToKey(l.buyerAddress)] += (lockAmount >> 1);
|
||||||
@@ -247,15 +240,15 @@ contract P2PIX is BaseUtils {
|
|||||||
lockAmount
|
lockAmount
|
||||||
);
|
);
|
||||||
|
|
||||||
emit LockReleased(l.buyerAddress, args.lockID, lockAmount);
|
emit LockReleased(l.buyerAddress, lockID, lockAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @notice Unlocks expired locks.
|
/// @notice Unlocks expired locks.
|
||||||
/// @dev Triggered in the callgraph by both `lock` and `withdraw` functions.
|
/// @notice Triggered in the callgraph by both `lock` and `withdraw` functions.
|
||||||
/// @dev This method can also have any public actor as its `tx.origin`.
|
/// @notice This method can also have any public actor as its `tx.origin`.
|
||||||
/// @dev For each successfull unexpired lock recovered,
|
/// @notice For each successfull unexpired lock recovered,
|
||||||
/// `userRecord[_castAddrToKey(l.relayerAddress)]` is decreased by half of its value.
|
/// `userRecord[_castAddrToKey(l.relayerAddress)]` is decreased by half of its value.
|
||||||
/// @dev Function sighash: 0x8e2749d6.
|
/// @dev Function sighash: 0xb0983d39
|
||||||
function unlockExpired(uint256[] calldata lockIDs)
|
function unlockExpired(uint256[] calldata lockIDs)
|
||||||
public
|
public
|
||||||
{
|
{
|
||||||
@@ -305,9 +298,9 @@ contract P2PIX is BaseUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// @notice Seller's expired deposit fund sweeper.
|
/// @notice Seller's expired deposit fund sweeper.
|
||||||
/// @dev A seller may use this method to recover
|
/// @notice A seller may use this method to recover
|
||||||
/// tokens from expired deposits.
|
/// tokens from expired deposits.
|
||||||
/// @dev Function sighash: 0x36317972.
|
/// @dev Function sighash: 0xfb8c5ef0
|
||||||
function withdraw(
|
function withdraw(
|
||||||
ERC20 token,
|
ERC20 token,
|
||||||
uint256 amount,
|
uint256 amount,
|
||||||
@@ -365,15 +358,12 @@ contract P2PIX is BaseUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ███ Helper FX ██████████████████████████████████████████████████████████
|
|
||||||
|
|
||||||
// solhint-disable-next-line no-empty-blocks
|
// solhint-disable-next-line no-empty-blocks
|
||||||
receive() external payable {}
|
receive() external payable {}
|
||||||
|
|
||||||
/// @notice Private view auxiliar logic that reverts
|
/// @notice Private view auxiliar logic that reverts
|
||||||
/// on a not expired lock passed as argument of the function.
|
/// on a not expired lock passed as argument of the function.
|
||||||
/// @dev Called exclusively by the `unlockExpired` method.
|
/// @dev Called exclusively by the `unlockExpired` method.
|
||||||
/// @dev Function sighash: 0x74e2a0bb.
|
|
||||||
function _notExpired(DT.Lock storage _l) private view {
|
function _notExpired(DT.Lock storage _l) private view {
|
||||||
if (_l.expirationBlock > block.number)
|
if (_l.expirationBlock > block.number)
|
||||||
revert NotExpired();
|
revert NotExpired();
|
||||||
@@ -383,12 +373,10 @@ contract P2PIX is BaseUtils {
|
|||||||
function _addLock(
|
function _addLock(
|
||||||
uint256 _bal,
|
uint256 _bal,
|
||||||
DT.Lock memory _l
|
DT.Lock memory _l
|
||||||
) internal returns(uint256 counter){
|
) internal {
|
||||||
mapLocks[_l.counter] = _l;
|
mapLocks[_l.counter] = _l;
|
||||||
|
|
||||||
_decBal(_bal, _l.amount, ERC20(_l.token), _l.seller);
|
_decBal(_bal, _l.amount, ERC20(_l.token), _l.seller);
|
||||||
++lockCounter;
|
|
||||||
counter = _l.counter;
|
|
||||||
|
|
||||||
emit LockAdded(
|
emit LockAdded(
|
||||||
_l.buyerAddress,
|
_l.buyerAddress,
|
||||||
@@ -516,7 +504,7 @@ contract P2PIX is BaseUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// @notice External getter that returns the status of a lockIDs array.
|
/// @notice External getter that returns the status of a lockIDs array.
|
||||||
/// @dev Call will not revert if provided with an empty array as parameter.
|
/// @notice Call will not revert if provided with an empty array as parameter.
|
||||||
/// @dev Function sighash: 0x49ef8448
|
/// @dev Function sighash: 0x49ef8448
|
||||||
function getLocksStatus(uint256[] memory ids)
|
function getLocksStatus(uint256[] memory ids)
|
||||||
external
|
external
|
||||||
|
|||||||
9
deploys/rsktestnet.json
Normal file
9
deploys/rsktestnet.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"signers": [
|
||||||
|
"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
|
||||||
|
"0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
|
||||||
|
"0x8963E134E6d22Ee9A26ac62a99964aB391ead816"
|
||||||
|
],
|
||||||
|
"token": "0xfE841c74250e57640390f46d914C88d22C51e82e",
|
||||||
|
"p2pix": "0x57Dcba05980761169508886eEdc6f5E7EC0411Dc"
|
||||||
|
}
|
||||||
8
deploys/sepolia.json
Normal file
8
deploys/sepolia.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"signers": [
|
||||||
|
"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
|
||||||
|
"0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
|
||||||
|
],
|
||||||
|
"p2pix": "0xb7cD135F5eFD9760981e02E2a898790b688939fe",
|
||||||
|
"token": "0x3eBE67A2C7bdB2081CBd34ba3281E90377462289"
|
||||||
|
}
|
||||||
@@ -1 +0,0 @@
|
|||||||
# DataTypes
|
|
||||||
@@ -1,264 +0,0 @@
|
|||||||
# EventAndErrors
|
|
||||||
|
|
||||||
## Events
|
|
||||||
|
|
||||||
### AllowedERC20Updated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event AllowedERC20Updated(address indexed token, bool indexed state)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------------- | ------- | ----------- |
|
|
||||||
| token `indexed` | address | undefined |
|
|
||||||
| state `indexed` | bool | undefined |
|
|
||||||
|
|
||||||
### DepositAdded
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event DepositAdded(address indexed seller, uint256 depositID, address token, uint256 amount)
|
|
||||||
```
|
|
||||||
|
|
||||||
███ Events ████████████████████████████████████████████████████████████
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------------- | ------- | ----------- |
|
|
||||||
| seller `indexed` | address | undefined |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
| token | address | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
### DepositClosed
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event DepositClosed(address indexed seller, uint256 depositID)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------------- | ------- | ----------- |
|
|
||||||
| seller `indexed` | address | undefined |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
|
|
||||||
### DepositWithdrawn
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event DepositWithdrawn(address indexed seller, uint256 depositID, uint256 amount)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------------- | ------- | ----------- |
|
|
||||||
| seller `indexed` | address | undefined |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
### FundsWithdrawn
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event FundsWithdrawn(address owner, uint256 amount)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------ | ------- | ----------- |
|
|
||||||
| owner | address | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
### LockAdded
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event LockAdded(address indexed buyer, bytes32 indexed lockID, uint256 depositID, uint256 amount)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------------- | ------- | ----------- |
|
|
||||||
| buyer `indexed` | address | undefined |
|
|
||||||
| lockID `indexed` | bytes32 | undefined |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
### LockBlocksUpdated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event LockBlocksUpdated(uint256 blocks)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------ | ------- | ----------- |
|
|
||||||
| blocks | uint256 | undefined |
|
|
||||||
|
|
||||||
### LockReleased
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event LockReleased(address indexed buyer, bytes32 lockId)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------------- | ------- | ----------- |
|
|
||||||
| buyer `indexed` | address | undefined |
|
|
||||||
| lockId | bytes32 | undefined |
|
|
||||||
|
|
||||||
### LockReturned
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event LockReturned(address indexed buyer, bytes32 lockId)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------------- | ------- | ----------- |
|
|
||||||
| buyer `indexed` | address | undefined |
|
|
||||||
| lockId | bytes32 | undefined |
|
|
||||||
|
|
||||||
### ReputationUpdated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event ReputationUpdated(address reputation)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------- | ------- | ----------- |
|
|
||||||
| reputation | address | undefined |
|
|
||||||
|
|
||||||
### ValidSignersUpdated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event ValidSignersUpdated(address[] signers)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------- | --------- | ----------- |
|
|
||||||
| signers | address[] | undefined |
|
|
||||||
|
|
||||||
## Errors
|
|
||||||
|
|
||||||
### AddressDenied
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error AddressDenied()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Address doesn't exist in a MerkleTree.Address not allowed as relayer.0x3b8474be_
|
|
||||||
|
|
||||||
### AlreadyReleased
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error AlreadyReleased()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Lock already released or returned.0x63b4904e_
|
|
||||||
|
|
||||||
### AmountNotAllowed
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error AmountNotAllowed()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Wished amount to be locked exceeds the limit allowed.0x1c18f846_
|
|
||||||
|
|
||||||
### DepositAlreadyExists
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error DepositAlreadyExists()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Deposit already exist and it is still valid.0xc44bd765_
|
|
||||||
|
|
||||||
### InvalidDeposit
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error InvalidDeposit()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Deposit not valid anymore.0xb2e532de_
|
|
||||||
|
|
||||||
### InvalidSigner
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error InvalidSigner()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Signer is not a valid signer.0x815e1d64_
|
|
||||||
|
|
||||||
### LengthMismatch
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error LengthMismatch()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Arrays' length don't match.0xff633a38_
|
|
||||||
|
|
||||||
### LoopOverflow
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error LoopOverflow()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Loop bounds have overflowed.0xdfb035c9_
|
|
||||||
|
|
||||||
### NoTokens
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error NoTokens()
|
|
||||||
```
|
|
||||||
|
|
||||||
_No tokens array provided as argument.0xdf957883_
|
|
||||||
|
|
||||||
### NotEnoughTokens
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error NotEnoughTokens()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Not enough token remaining on deposit.0x22bbb43c_
|
|
||||||
|
|
||||||
### NotExpired
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error NotExpired()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Lock not expired or already released.Another lock with same ID is not expired yet.0xd0404f85_
|
|
||||||
|
|
||||||
### OnlySeller
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error OnlySeller()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Only seller could call this function.`msg.sender` and the seller differ.0x85d1f726_
|
|
||||||
|
|
||||||
### TokenDenied
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error TokenDenied()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Token address not allowed to be deposited.0x1578328e_
|
|
||||||
|
|
||||||
### TxAlreadyUsed
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error TxAlreadyUsed()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Transaction already used to unlock payment.0xf490a6ea_
|
|
||||||
694
docs/P2PIX.md
694
docs/P2PIX.md
@@ -1,694 +0,0 @@
|
|||||||
# P2PIX
|
|
||||||
|
|
||||||
## Methods
|
|
||||||
|
|
||||||
### \_castAddrToKey
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function _castAddrToKey(address _addr) external pure returns (uint256 _key)
|
|
||||||
```
|
|
||||||
|
|
||||||
Public method that handles `address` to `uint256` safe type casting.
|
|
||||||
|
|
||||||
_Function sighash: 0x4b2ae980._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------ | ------- | ----------- |
|
|
||||||
| \_addr | address | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ----- | ------- | ----------- |
|
|
||||||
| \_key | uint256 | undefined |
|
|
||||||
|
|
||||||
### allowedERC20s
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function allowedERC20s(contract ERC20) external view returns (bool)
|
|
||||||
```
|
|
||||||
|
|
||||||
_Tokens allowed to serve as the underlying amount of a deposit._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | -------------- | ----------- |
|
|
||||||
| \_0 | contract ERC20 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ---- | ----------- |
|
|
||||||
| \_0 | bool | undefined |
|
|
||||||
|
|
||||||
### cancelDeposit
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function cancelDeposit(uint256 depositID) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
Enables seller to invalidate future locks made to his/her token offering order.
|
|
||||||
|
|
||||||
_This function does not affect any ongoing active locks.Function sighash: 0x72fada5c._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------- | ------- | ----------- |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
|
|
||||||
### defaultLockBlocks
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function defaultLockBlocks() external view returns (uint256)
|
|
||||||
```
|
|
||||||
|
|
||||||
_Default blocks that lock will hold tokens._
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
### deposit
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function deposit(address _token, uint256 _amount, string _pixTarget, bytes32 allowlistRoot) external nonpayable returns (uint256 depositID)
|
|
||||||
```
|
|
||||||
|
|
||||||
Creates a deposit order based on a seller's offer of an amount of ERC20 tokens.
|
|
||||||
|
|
||||||
_Seller needs to send his tokens to the P2PIX smart contract.Function sighash: 0xbfe07da6._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------- | ------- | ------------------------------------------------------- |
|
|
||||||
| \_token | address | undefined |
|
|
||||||
| \_amount | uint256 | undefined |
|
|
||||||
| \_pixTarget | string | Pix key destination provided by the offer's seller. |
|
|
||||||
| allowlistRoot | bytes32 | Optional allow list merkleRoot update `bytes32` value. |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------- | ------- | -------------------------------------------------------------- |
|
|
||||||
| depositID | uint256 | The `uint256` return value provided as the deposit identifier. |
|
|
||||||
|
|
||||||
### depositCount
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function depositCount() external view returns (uint256 _val)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ----- | ------- | ----------- |
|
|
||||||
| \_val | uint256 | undefined |
|
|
||||||
|
|
||||||
### lock
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function lock(uint256 _depositID, address _buyerAddress, address _relayerTarget, uint256 _relayerPremium, uint256 _amount, bytes32[] merkleProof, bytes32[] expiredLocks) external nonpayable returns (bytes32 lockID)
|
|
||||||
```
|
|
||||||
|
|
||||||
Public method designed to lock an remaining amount of the deposit order of a seller.
|
|
||||||
|
|
||||||
_This method can be performed either by: - An user allowed via the seller's allowlist; - An user with enough userRecord to lock the wished amount; There can only exist a lock per each `_amount` partitioned from the total `remaining` value.Locks can only be performed in valid orders.Function sighash: 0x03aaf306._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------------- | --------- | ------------------------------------------------------------------------------------------------------------------------ |
|
|
||||||
| \_depositID | uint256 | undefined |
|
|
||||||
| \_buyerAddress | address | The address of the buyer of a `_depositID`. |
|
|
||||||
| \_relayerTarget | address | Target address entitled to the `relayerPremim`. |
|
|
||||||
| \_relayerPremium | uint256 | The refund/premium owed to a relayer. |
|
|
||||||
| \_amount | uint256 | The deposit's remaining amount wished to be locked. |
|
|
||||||
| merkleProof | bytes32[] | This value should be: - Provided as a pass if the `msg.sender` is in the seller's allowlist; - Left empty otherwise; |
|
|
||||||
| expiredLocks | bytes32[] | An array of `bytes32` identifiers to be provided so to unexpire locks using this transaction gas push. |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------ | ------- | ---------------------------------------------------- |
|
|
||||||
| lockID | bytes32 | The `bytes32` value returned as the lock identifier. |
|
|
||||||
|
|
||||||
### mapDeposits
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function mapDeposits(uint256) external view returns (uint256 remaining, string pixTarget, address seller, address token, bool valid)
|
|
||||||
```
|
|
||||||
|
|
||||||
_Seller list of deposits_
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------- | ------- | ----------- |
|
|
||||||
| remaining | uint256 | undefined |
|
|
||||||
| pixTarget | string | undefined |
|
|
||||||
| seller | address | undefined |
|
|
||||||
| token | address | undefined |
|
|
||||||
| valid | bool | undefined |
|
|
||||||
|
|
||||||
### mapLocks
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function mapLocks(bytes32) external view returns (uint256 depositID, uint256 relayerPremium, uint256 amount, uint256 expirationBlock, address buyerAddress, address relayerTarget, address relayerAddress)
|
|
||||||
```
|
|
||||||
|
|
||||||
_List of Locks._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | bytes32 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------------- | ------- | ----------- |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
| relayerPremium | uint256 | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
| expirationBlock | uint256 | undefined |
|
|
||||||
| buyerAddress | address | undefined |
|
|
||||||
| relayerTarget | address | undefined |
|
|
||||||
| relayerAddress | address | undefined |
|
|
||||||
|
|
||||||
### owner
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function owner() external view returns (address)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | address | undefined |
|
|
||||||
|
|
||||||
### release
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function release(bytes32 lockID, address _relayerTarget, uint256 pixTimestamp, bytes32 r, bytes32 s, uint8 v) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
Lock release method that liquidate lock orders and distributes relayer fees.
|
|
||||||
|
|
||||||
_This method can be called by any public actor as long the signature provided is valid.`relayerPremium` gets splitted equaly if `relayerTarget` addresses differ.If the `msg.sender` of this method and `l.relayerAddress` are the same, `msg.sender` accrues both l.amount and l.relayerPremium as userRecord credit. In case of they differing: - `lock` caller gets accrued with `l.amount` as userRecord credit; - `release` caller gets accrued with `l.relayerPremium` as userRecord credit; Function sighash: 0x4e1389ed._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------------- | ------- | ----------------------------------------------- |
|
|
||||||
| lockID | bytes32 | undefined |
|
|
||||||
| \_relayerTarget | address | Target address entitled to the `relayerPremim`. |
|
|
||||||
| pixTimestamp | uint256 | undefined |
|
|
||||||
| r | bytes32 | undefined |
|
|
||||||
| s | bytes32 | undefined |
|
|
||||||
| v | uint8 | undefined |
|
|
||||||
|
|
||||||
### reputation
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function reputation() external view returns (contract IReputation)
|
|
||||||
```
|
|
||||||
|
|
||||||
███ Storage ████████████████████████████████████████████████████████████
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | -------------------- | ----------- |
|
|
||||||
| \_0 | contract IReputation | undefined |
|
|
||||||
|
|
||||||
### sellerAllowList
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function sellerAllowList(uint256) external view returns (bytes32)
|
|
||||||
```
|
|
||||||
|
|
||||||
_Seller casted to key => Seller's allowlist merkleroot._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | bytes32 | undefined |
|
|
||||||
|
|
||||||
### setDefaultLockBlocks
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function setDefaultLockBlocks(uint256 _blocks) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| -------- | ------- | ----------- |
|
|
||||||
| \_blocks | uint256 | undefined |
|
|
||||||
|
|
||||||
### setOwner
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function setOwner(address newOwner) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| -------- | ------- | ----------- |
|
|
||||||
| newOwner | address | undefined |
|
|
||||||
|
|
||||||
### setReputation
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function setReputation(contract IReputation _reputation) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------ | -------------------- | ----------- |
|
|
||||||
| \_reputation | contract IReputation | undefined |
|
|
||||||
|
|
||||||
### setRoot
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function setRoot(address addr, bytes32 merkleroot) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------- | ------- | ----------- |
|
|
||||||
| addr | address | undefined |
|
|
||||||
| merkleroot | bytes32 | undefined |
|
|
||||||
|
|
||||||
### setValidSigners
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function setValidSigners(address[] _validSigners) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| -------------- | --------- | ----------- |
|
|
||||||
| \_validSigners | address[] | undefined |
|
|
||||||
|
|
||||||
### tokenSettings
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function tokenSettings(address[] _tokens, bool[] _states) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| -------- | --------- | ----------- |
|
|
||||||
| \_tokens | address[] | undefined |
|
|
||||||
| \_states | bool[] | undefined |
|
|
||||||
|
|
||||||
### unlockExpired
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function unlockExpired(bytes32[] lockIDs) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
Unlocks expired locks.
|
|
||||||
|
|
||||||
_Triggered in the callgraph by both `lock` and `withdraw` functions.This method can also have any public actor as its `tx.origin`.For each successfull unexpired lock recovered, `userRecord[_castAddrToKey(l.relayerAddress)]` is decreased by half of its value.Function sighash: 0x8e2749d6._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------- | --------- | ----------- |
|
|
||||||
| lockIDs | bytes32[] | undefined |
|
|
||||||
|
|
||||||
### userRecord
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function userRecord(uint256) external view returns (uint256)
|
|
||||||
```
|
|
||||||
|
|
||||||
_Stores an relayer's last computed credit._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
### validBacenSigners
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function validBacenSigners(uint256) external view returns (bool)
|
|
||||||
```
|
|
||||||
|
|
||||||
_List of valid Bacen signature addresses_
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ---- | ----------- |
|
|
||||||
| \_0 | bool | undefined |
|
|
||||||
|
|
||||||
### withdraw
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function withdraw(uint256 depositID, bytes32[] expiredLocks) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
Seller's expired deposit fund sweeper.
|
|
||||||
|
|
||||||
_A seller may use this method to recover tokens from expired deposits.Function sighash: 0x36317972._
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------ | --------- | ----------- |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
| expiredLocks | bytes32[] | undefined |
|
|
||||||
|
|
||||||
### withdrawBalance
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function withdrawBalance() external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
_Contract's underlying balance withdraw method.Function sighash: 0x5fd8c710._
|
|
||||||
|
|
||||||
## Events
|
|
||||||
|
|
||||||
### AllowedERC20Updated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event AllowedERC20Updated(address indexed token, bool indexed state)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------------- | ------- | ----------- |
|
|
||||||
| token `indexed` | address | undefined |
|
|
||||||
| state `indexed` | bool | undefined |
|
|
||||||
|
|
||||||
### DepositAdded
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event DepositAdded(address indexed seller, uint256 depositID, address token, uint256 amount)
|
|
||||||
```
|
|
||||||
|
|
||||||
███ Events ████████████████████████████████████████████████████████████
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------------- | ------- | ----------- |
|
|
||||||
| seller `indexed` | address | undefined |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
| token | address | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
### DepositClosed
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event DepositClosed(address indexed seller, uint256 depositID)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------------- | ------- | ----------- |
|
|
||||||
| seller `indexed` | address | undefined |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
|
|
||||||
### DepositWithdrawn
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event DepositWithdrawn(address indexed seller, uint256 depositID, uint256 amount)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------------- | ------- | ----------- |
|
|
||||||
| seller `indexed` | address | undefined |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
### FundsWithdrawn
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event FundsWithdrawn(address owner, uint256 amount)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------ | ------- | ----------- |
|
|
||||||
| owner | address | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
### LockAdded
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event LockAdded(address indexed buyer, bytes32 indexed lockID, uint256 depositID, uint256 amount)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------------- | ------- | ----------- |
|
|
||||||
| buyer `indexed` | address | undefined |
|
|
||||||
| lockID `indexed` | bytes32 | undefined |
|
|
||||||
| depositID | uint256 | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
### LockBlocksUpdated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event LockBlocksUpdated(uint256 blocks)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------ | ------- | ----------- |
|
|
||||||
| blocks | uint256 | undefined |
|
|
||||||
|
|
||||||
### LockReleased
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event LockReleased(address indexed buyer, bytes32 lockId)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------------- | ------- | ----------- |
|
|
||||||
| buyer `indexed` | address | undefined |
|
|
||||||
| lockId | bytes32 | undefined |
|
|
||||||
|
|
||||||
### LockReturned
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event LockReturned(address indexed buyer, bytes32 lockId)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| --------------- | ------- | ----------- |
|
|
||||||
| buyer `indexed` | address | undefined |
|
|
||||||
| lockId | bytes32 | undefined |
|
|
||||||
|
|
||||||
### OwnerUpdated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event OwnerUpdated(address indexed user, address indexed newOwner)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------------ | ------- | ----------- |
|
|
||||||
| user `indexed` | address | undefined |
|
|
||||||
| newOwner `indexed` | address | undefined |
|
|
||||||
|
|
||||||
### ReputationUpdated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event ReputationUpdated(address reputation)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---------- | ------- | ----------- |
|
|
||||||
| reputation | address | undefined |
|
|
||||||
|
|
||||||
### ValidSignersUpdated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event ValidSignersUpdated(address[] signers)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------- | --------- | ----------- |
|
|
||||||
| signers | address[] | undefined |
|
|
||||||
|
|
||||||
## Errors
|
|
||||||
|
|
||||||
### AddressDenied
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error AddressDenied()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Address doesn't exist in a MerkleTree.Address not allowed as relayer.0x3b8474be_
|
|
||||||
|
|
||||||
### AlreadyReleased
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error AlreadyReleased()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Lock already released or returned.0x63b4904e_
|
|
||||||
|
|
||||||
### AmountNotAllowed
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error AmountNotAllowed()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Wished amount to be locked exceeds the limit allowed.0x1c18f846_
|
|
||||||
|
|
||||||
### DepositAlreadyExists
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error DepositAlreadyExists()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Deposit already exist and it is still valid.0xc44bd765_
|
|
||||||
|
|
||||||
### InvalidDeposit
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error InvalidDeposit()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Deposit not valid anymore.0xb2e532de_
|
|
||||||
|
|
||||||
### InvalidSigner
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error InvalidSigner()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Signer is not a valid signer.0x815e1d64_
|
|
||||||
|
|
||||||
### LengthMismatch
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error LengthMismatch()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Arrays' length don't match.0xff633a38_
|
|
||||||
|
|
||||||
### LoopOverflow
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error LoopOverflow()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Loop bounds have overflowed.0xdfb035c9_
|
|
||||||
|
|
||||||
### NoTokens
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error NoTokens()
|
|
||||||
```
|
|
||||||
|
|
||||||
_No tokens array provided as argument.0xdf957883_
|
|
||||||
|
|
||||||
### NotEnoughTokens
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error NotEnoughTokens()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Not enough token remaining on deposit.0x22bbb43c_
|
|
||||||
|
|
||||||
### NotExpired
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error NotExpired()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Lock not expired or already released.Another lock with same ID is not expired yet.0xd0404f85_
|
|
||||||
|
|
||||||
### OnlySeller
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error OnlySeller()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Only seller could call this function.`msg.sender` and the seller differ.0x85d1f726_
|
|
||||||
|
|
||||||
### Reentrancy
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error Reentrancy()
|
|
||||||
```
|
|
||||||
|
|
||||||
### TokenDenied
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error TokenDenied()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Token address not allowed to be deposited.0x1578328e_
|
|
||||||
|
|
||||||
### TxAlreadyUsed
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
error TxAlreadyUsed()
|
|
||||||
```
|
|
||||||
|
|
||||||
_Transaction already used to unlock payment.0xf490a6ea_
|
|
||||||
@@ -1,6 +1,28 @@
|
|||||||
# Reputation
|
# Solidity API
|
||||||
|
|
||||||
## Methods
|
## Reputation
|
||||||
|
|
||||||
|
### maxLimit
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 maxLimit
|
||||||
|
```
|
||||||
|
|
||||||
|
_Asymptote numerator constant value for the `limiter` fx._
|
||||||
|
|
||||||
|
### magicValue
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 magicValue
|
||||||
|
```
|
||||||
|
|
||||||
|
_Denominator's constant operand for the `limiter` fx._
|
||||||
|
|
||||||
|
### constructor
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
constructor() public payable
|
||||||
|
```
|
||||||
|
|
||||||
### limiter
|
### limiter
|
||||||
|
|
||||||
@@ -8,81 +30,12 @@
|
|||||||
function limiter(uint256 _userCredit) external pure returns (uint256 _spendLimit)
|
function limiter(uint256 _userCredit) external pure returns (uint256 _spendLimit)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Parameters
|
### sqrt
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------ | ------- | ----------- |
|
|
||||||
| \_userCredit | uint256 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------ | ------- | ----------- |
|
|
||||||
| \_spendLimit | uint256 | undefined |
|
|
||||||
|
|
||||||
### magicValue
|
|
||||||
|
|
||||||
```solidity
|
```solidity
|
||||||
function magicValue() external view returns (uint256)
|
function sqrt(uint256 x) internal pure returns (uint256 z)
|
||||||
```
|
```
|
||||||
|
|
||||||
_Denominator's constant operand for the `limiter` fx. _
|
Taken from Solmate's FixedPointMathLib.
|
||||||
|
(https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
### maxLimit
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function maxLimit() external view returns (uint256)
|
|
||||||
```
|
|
||||||
|
|
||||||
_Asymptote numerator constant value for the `limiter` fx._
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
### owner
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function owner() external view returns (address)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | address | undefined |
|
|
||||||
|
|
||||||
### setOwner
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function setOwner(address newOwner) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| -------- | ------- | ----------- |
|
|
||||||
| newOwner | address | undefined |
|
|
||||||
|
|
||||||
## Events
|
|
||||||
|
|
||||||
### OwnerUpdated
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
event OwnerUpdated(address indexed user, address indexed newOwner)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------------ | ------- | ----------- |
|
|
||||||
| user `indexed` | address | undefined |
|
|
||||||
| newOwner `indexed` | address | undefined |
|
|
||||||
|
|||||||
89
docs/core/BaseUtils.md
Normal file
89
docs/core/BaseUtils.md
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## BaseUtils
|
||||||
|
|
||||||
|
### _setUsedTransactions
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _setUsedTransactions(bytes32 message) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
███ Helper FX ██████████████████████████████████████████████████████████
|
||||||
|
|
||||||
|
### usedTransactions
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function usedTransactions(bytes32 message) public view returns (bool used)
|
||||||
|
```
|
||||||
|
|
||||||
|
### _signerCheck
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _signerCheck(bytes32 _message, bytes _signature) internal view
|
||||||
|
```
|
||||||
|
|
||||||
|
### _merkleVerify
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _merkleVerify(bytes32[] _merkleProof, bytes32 _root, address _addr) internal pure
|
||||||
|
```
|
||||||
|
|
||||||
|
### _castBool
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _castBool(bool _valid) internal pure returns (uint256 _validCasted)
|
||||||
|
```
|
||||||
|
|
||||||
|
### getStr
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function getStr(string str) public pure returns (bytes32 strEnc)
|
||||||
|
```
|
||||||
|
|
||||||
|
### _setSellerBalance
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _setSellerBalance(address _sellerKey, contract ERC20 _erc20, uint256 _packed, bytes32 _pixTarget) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
### _setValidState
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _setValidState(address _sellerKey, contract ERC20 _erc20, uint256 _packed) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
### _addSellerBalance
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _addSellerBalance(address _sellerKey, contract ERC20 _erc20, uint256 _amount) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
### _decSellerBalance
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _decSellerBalance(address _sellerKey, contract ERC20 _erc20, uint256 _amount) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
### __sellerBalance
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function __sellerBalance(address _sellerKey, contract ERC20 _erc20) internal view returns (uint256 _packed)
|
||||||
|
```
|
||||||
|
|
||||||
|
### _castAddrToKey
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _castAddrToKey(address _addr) public pure returns (uint256 _key)
|
||||||
|
```
|
||||||
|
|
||||||
|
Public method that handles `address`
|
||||||
|
to `uint256` safe type casting.
|
||||||
|
|
||||||
|
_Function sighash: 0x4b2ae980._
|
||||||
|
|
||||||
|
### _castKeyToAddr
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _castKeyToAddr(uint256 _key) public pure returns (address _addr)
|
||||||
|
```
|
||||||
|
|
||||||
96
docs/core/Constants.md
Normal file
96
docs/core/Constants.md
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## Constants
|
||||||
|
|
||||||
|
### _ROOT_UPDATED_EVENT_SIGNATURE
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 _ROOT_UPDATED_EVENT_SIGNATURE
|
||||||
|
```
|
||||||
|
|
||||||
|
███ Constants ██████████████████████████████████████████████████████████
|
||||||
|
|
||||||
|
### _ALLOWED_ERC20_UPDATED_EVENT_SIGNATURE
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 _ALLOWED_ERC20_UPDATED_EVENT_SIGNATURE
|
||||||
|
```
|
||||||
|
|
||||||
|
### _TRUSTED_FORWARDER_UPDATED_EVENT_SIGNATURE
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 _TRUSTED_FORWARDER_UPDATED_EVENT_SIGNATURE
|
||||||
|
```
|
||||||
|
|
||||||
|
### _SELLER_ALLOWLIST_SLOT_SEED
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 _SELLER_ALLOWLIST_SLOT_SEED
|
||||||
|
```
|
||||||
|
|
||||||
|
_Seller casted to key => Seller's allowlist merkleroot.
|
||||||
|
mapping(uint256 => bytes32) public sellerAllowList;_
|
||||||
|
|
||||||
|
### _ALLOWED_ERC20_SLOT_SEED
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 _ALLOWED_ERC20_SLOT_SEED
|
||||||
|
```
|
||||||
|
|
||||||
|
_Tokens allowed to serve as the underlying amount of a deposit.
|
||||||
|
mapping(ERC20 => bool) public allowedERC20s;_
|
||||||
|
|
||||||
|
### _SELLER_BALANCE_SLOT_SEED
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 _SELLER_BALANCE_SLOT_SEED
|
||||||
|
```
|
||||||
|
|
||||||
|
_Value in custom storage slot given by:
|
||||||
|
mstore(0x20, token)
|
||||||
|
mstore(0x0c, _SELLER_BALANCE_SLOT_SEED)
|
||||||
|
mstore(0x00, seller)
|
||||||
|
let value := sload(keccak256(0x0c, 0x34))._
|
||||||
|
|
||||||
|
### BITMASK_SB_ENTRY
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 BITMASK_SB_ENTRY
|
||||||
|
```
|
||||||
|
|
||||||
|
_The bitmask of `sellerBalance` entry._
|
||||||
|
|
||||||
|
### BITPOS_VALID
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 BITPOS_VALID
|
||||||
|
```
|
||||||
|
|
||||||
|
_The bit position of `valid` in `sellerBalance`._
|
||||||
|
|
||||||
|
### WAD
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 WAD
|
||||||
|
```
|
||||||
|
|
||||||
|
_The scalar of BRZ token._
|
||||||
|
|
||||||
|
### MAXBALANCE_UPPERBOUND
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 MAXBALANCE_UPPERBOUND
|
||||||
|
```
|
||||||
|
|
||||||
|
### REPUTATION_LOWERBOUND
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 REPUTATION_LOWERBOUND
|
||||||
|
```
|
||||||
|
|
||||||
|
### LOCKAMOUNT_UPPERBOUND
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 LOCKAMOUNT_UPPERBOUND
|
||||||
|
```
|
||||||
|
|
||||||
29
docs/core/DataTypes.md
Normal file
29
docs/core/DataTypes.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## DataTypes
|
||||||
|
|
||||||
|
### Lock
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
struct Lock {
|
||||||
|
uint256 counter;
|
||||||
|
uint256 expirationBlock;
|
||||||
|
bytes32 pixTarget;
|
||||||
|
uint80 amount;
|
||||||
|
contract ERC20 token;
|
||||||
|
address buyerAddress;
|
||||||
|
address seller;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### LockStatus
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
enum LockStatus {
|
||||||
|
Inexistent,
|
||||||
|
Active,
|
||||||
|
Expired,
|
||||||
|
Released
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
278
docs/core/EventAndErrors.md
Normal file
278
docs/core/EventAndErrors.md
Normal file
@@ -0,0 +1,278 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## EventAndErrors
|
||||||
|
|
||||||
|
### DepositAdded
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event DepositAdded(address seller, contract ERC20 token, uint256 amount)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf_
|
||||||
|
|
||||||
|
### ValidSet
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event ValidSet(address seller, contract ERC20 token, bool state)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0xca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49_
|
||||||
|
|
||||||
|
### DepositWithdrawn
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event DepositWithdrawn(address seller, contract ERC20 token, uint256 amount)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e_
|
||||||
|
|
||||||
|
### LockAdded
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event LockAdded(address buyer, uint256 lockID, address seller, uint256 amount)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea65_
|
||||||
|
|
||||||
|
### LockReleased
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event LockReleased(address buyer, uint256 lockId, uint256 amount)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8_
|
||||||
|
|
||||||
|
### LockReturned
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event LockReturned(address buyer, uint256 lockId)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5_
|
||||||
|
|
||||||
|
### FundsWithdrawn
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event FundsWithdrawn(address owner, uint256 amount)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0xeaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d_
|
||||||
|
|
||||||
|
### RootUpdated
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event RootUpdated(address seller, bytes32 merkleRoot)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632_
|
||||||
|
|
||||||
|
### AllowedERC20Updated
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event AllowedERC20Updated(address token, bool state)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a_
|
||||||
|
|
||||||
|
### TrustedForwarderUpdated
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event TrustedForwarderUpdated(address forwarder, bool state)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0xbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df92_
|
||||||
|
|
||||||
|
### ReputationUpdated
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event ReputationUpdated(address reputation)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0xe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f_
|
||||||
|
|
||||||
|
### LockBlocksUpdated
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event LockBlocksUpdated(uint256 blocks)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511_
|
||||||
|
|
||||||
|
### ValidSignersUpdated
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
event ValidSignersUpdated(address[] signers)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7_
|
||||||
|
|
||||||
|
### OnlySeller
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error OnlySeller()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Only seller could call this function.
|
||||||
|
`msg.sender` and the seller differ.
|
||||||
|
0x85d1f726_
|
||||||
|
|
||||||
|
### NotExpired
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error NotExpired()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Lock not expired or already released.
|
||||||
|
Another lock with same ID is not expired yet.
|
||||||
|
0xd0404f85_
|
||||||
|
|
||||||
|
### LoopOverflow
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error LoopOverflow()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Loop bounds have overflowed.
|
||||||
|
0xdfb035c9_
|
||||||
|
|
||||||
|
### InvalidDeposit
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error InvalidDeposit()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Deposit not valid anymore.
|
||||||
|
0xb2e532de_
|
||||||
|
|
||||||
|
### NotEnoughTokens
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error NotEnoughTokens()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Not enough token remaining on deposit.
|
||||||
|
0x22bbb43c_
|
||||||
|
|
||||||
|
### AlreadyReleased
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error AlreadyReleased()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Lock already released or returned.
|
||||||
|
0x63b4904e_
|
||||||
|
|
||||||
|
### TxAlreadyUsed
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error TxAlreadyUsed()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Transaction already used to unlock payment.
|
||||||
|
0xf490a6ea_
|
||||||
|
|
||||||
|
### InvalidSigner
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error InvalidSigner()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Signer is not a valid signer.
|
||||||
|
0x815e1d64_
|
||||||
|
|
||||||
|
### AddressDenied
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error AddressDenied()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Address doesn't exist in a MerkleTree.
|
||||||
|
Address not allowed as relayer.
|
||||||
|
0x3b8474be_
|
||||||
|
|
||||||
|
### LengthMismatch
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error LengthMismatch()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Arrays' length don't match.
|
||||||
|
0xff633a38_
|
||||||
|
|
||||||
|
### NoTokens
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error NoTokens()
|
||||||
|
```
|
||||||
|
|
||||||
|
_No tokens array provided as argument.
|
||||||
|
0xdf957883_
|
||||||
|
|
||||||
|
### TokenDenied
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error TokenDenied()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Token address not allowed to be deposited.
|
||||||
|
0x1578328e_
|
||||||
|
|
||||||
|
### AmountNotAllowed
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error AmountNotAllowed()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Wished amount to be locked exceeds the limit allowed.
|
||||||
|
0x1c18f846_
|
||||||
|
|
||||||
|
### StaticCallFailed
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error StaticCallFailed()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Reverts when success return value returns false.
|
||||||
|
0xe10bf1cc_
|
||||||
|
|
||||||
|
### LockExpired
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error LockExpired()
|
||||||
|
```
|
||||||
|
|
||||||
|
_Reverts on an expired lock.
|
||||||
|
0xf6fafba0_
|
||||||
|
|
||||||
|
### DecOverflow
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error DecOverflow()
|
||||||
|
```
|
||||||
|
|
||||||
|
_0xce3a3d37_
|
||||||
|
|
||||||
|
### MaxBalExceeded
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error MaxBalExceeded()
|
||||||
|
```
|
||||||
|
|
||||||
|
_0xf3fb0eb9_
|
||||||
|
|
||||||
|
### EmptyPixTarget
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error EmptyPixTarget()
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x6a3bc53e_
|
||||||
|
|
||||||
|
### NotInitialized
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error NotInitialized()
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x87138d5c_
|
||||||
|
|
||||||
98
docs/core/OwnerSettings.md
Normal file
98
docs/core/OwnerSettings.md
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## OwnerSettings
|
||||||
|
|
||||||
|
### reputation
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
contract IReputation reputation
|
||||||
|
```
|
||||||
|
|
||||||
|
_List of valid Bacen signature addresses
|
||||||
|
mapping(uint256 => bool) public validBacenSigners;
|
||||||
|
Value in custom storage slot given by:
|
||||||
|
let value := sload(shl(12, address))._
|
||||||
|
|
||||||
|
### defaultLockBlocks
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 defaultLockBlocks
|
||||||
|
```
|
||||||
|
|
||||||
|
_Default blocks that lock will hold tokens._
|
||||||
|
|
||||||
|
### constructor
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
constructor(uint256 defaultBlocks, address[] validSigners, address _reputation, contract ERC20[] tokens, bool[] tokenStates) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
███ Constructor ████████████████████████████████████████████████████████
|
||||||
|
|
||||||
|
### setTrustedFowarders
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function setTrustedFowarders(address[] forwarders, bool[] states) external
|
||||||
|
```
|
||||||
|
|
||||||
|
███ Owner Only █████████████████████████████████████████████████████████
|
||||||
|
|
||||||
|
### withdrawBalance
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function withdrawBalance() external
|
||||||
|
```
|
||||||
|
|
||||||
|
_Contract's underlying balance withdraw method.
|
||||||
|
Function sighash: 0x5fd8c710._
|
||||||
|
|
||||||
|
### setReputation
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function setReputation(contract IReputation _reputation) public
|
||||||
|
```
|
||||||
|
|
||||||
|
### setDefaultLockBlocks
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function setDefaultLockBlocks(uint256 _blocks) public
|
||||||
|
```
|
||||||
|
|
||||||
|
### setValidSigners
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function setValidSigners(address[] _validSigners) public
|
||||||
|
```
|
||||||
|
|
||||||
|
### tokenSettings
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function tokenSettings(contract ERC20[] _tokens, bool[] _states) public
|
||||||
|
```
|
||||||
|
|
||||||
|
### validBacenSigners
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function validBacenSigners(uint256 signer) public view returns (bool valid)
|
||||||
|
```
|
||||||
|
|
||||||
|
███ View FX ████████████████████████████████████████████████████████████
|
||||||
|
|
||||||
|
### sellerAllowList
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function sellerAllowList(address sellerKey) public view returns (bytes32 root)
|
||||||
|
```
|
||||||
|
|
||||||
|
### allowedERC20s
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function allowedERC20s(contract ERC20 erc20) public view returns (bool state)
|
||||||
|
```
|
||||||
|
|
||||||
|
### _limiter
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _limiter(uint256 _userCredit) internal view returns (uint256 _spendLimit)
|
||||||
|
```
|
||||||
|
|
||||||
@@ -1,46 +1,42 @@
|
|||||||
# Owned
|
# Solidity API
|
||||||
|
|
||||||
_Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)_
|
## Owned
|
||||||
|
|
||||||
Simple single owner authorization mixin.
|
Simple single owner authorization mixin.
|
||||||
|
|
||||||
## Methods
|
### Unauthorized
|
||||||
|
|
||||||
### owner
|
|
||||||
|
|
||||||
```solidity
|
```solidity
|
||||||
function owner() external view returns (address)
|
error Unauthorized()
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | address | undefined |
|
|
||||||
|
|
||||||
### setOwner
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function setOwner(address newOwner) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| -------- | ------- | ----------- |
|
|
||||||
| newOwner | address | undefined |
|
|
||||||
|
|
||||||
## Events
|
|
||||||
|
|
||||||
### OwnerUpdated
|
### OwnerUpdated
|
||||||
|
|
||||||
```solidity
|
```solidity
|
||||||
event OwnerUpdated(address indexed user, address indexed newOwner)
|
event OwnerUpdated(address user, address newOwner)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Parameters
|
### owner
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
address owner
|
||||||
|
```
|
||||||
|
|
||||||
|
### onlyOwner
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
modifier onlyOwner()
|
||||||
|
```
|
||||||
|
|
||||||
|
### constructor
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
constructor(address _owner) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
### setOwner
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function setOwner(address newOwner) public virtual
|
||||||
|
```
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------------ | ------- | ----------- |
|
|
||||||
| user `indexed` | address | undefined |
|
|
||||||
| newOwner `indexed` | address | undefined |
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# IReputation
|
# Solidity API
|
||||||
|
|
||||||
## Methods
|
## IReputation
|
||||||
|
|
||||||
### limiter
|
### limiter
|
||||||
|
|
||||||
@@ -8,14 +8,3 @@
|
|||||||
function limiter(uint256 _userCredit) external pure returns (uint256 _spendLimit)
|
function limiter(uint256 _userCredit) external pure returns (uint256 _spendLimit)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------ | ------- | ----------- |
|
|
||||||
| \_userCredit | uint256 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------------ | ------- | ----------- |
|
|
||||||
| \_spendLimit | uint256 | undefined |
|
|
||||||
|
|||||||
53
docs/lib/metatx/ERC2771Context.md
Normal file
53
docs/lib/metatx/ERC2771Context.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
_Provides information about the current execution context, including the
|
||||||
|
sender of the transaction and its data. While these are generally available
|
||||||
|
via msg.sender and msg.data, they should not be accessed in such a direct
|
||||||
|
manner, since when dealing with meta-transactions the account sending and
|
||||||
|
paying for execution may not be the actual sender (as far as an application
|
||||||
|
is concerned).
|
||||||
|
|
||||||
|
This contract is only required for intermediate, library-like contracts._
|
||||||
|
|
||||||
|
### _msgSender
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _msgSender() internal view virtual returns (address)
|
||||||
|
```
|
||||||
|
|
||||||
|
### _msgData
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _msgData() internal view virtual returns (bytes)
|
||||||
|
```
|
||||||
|
|
||||||
|
## ERC2771Context
|
||||||
|
|
||||||
|
_Context variant with ERC2771 support._
|
||||||
|
|
||||||
|
### trustedForwarders
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
mapping(address => bool) trustedForwarders
|
||||||
|
```
|
||||||
|
|
||||||
|
### _msgSender
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _msgSender() internal view virtual returns (address sender)
|
||||||
|
```
|
||||||
|
|
||||||
|
### isTrustedForwarder
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function isTrustedForwarder(address forwarder) public view virtual returns (bool)
|
||||||
|
```
|
||||||
|
|
||||||
|
### _msgData
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _msgData() internal view virtual returns (bytes)
|
||||||
|
```
|
||||||
|
|
||||||
16
docs/lib/mock/mockToken.md
Normal file
16
docs/lib/mock/mockToken.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## MockToken
|
||||||
|
|
||||||
|
### constructor
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
constructor(uint256 supply) public
|
||||||
|
```
|
||||||
|
|
||||||
|
### mint
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function mint(address[] to, uint256 value) public virtual
|
||||||
|
```
|
||||||
|
|
||||||
@@ -1,230 +1,128 @@
|
|||||||
# ERC20
|
# Solidity API
|
||||||
|
|
||||||
_Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)_
|
## ERC20
|
||||||
|
|
||||||
Modern and gas efficient ERC20 + EIP-2612 implementation.
|
Modern and gas efficient ERC20 + EIP-2612 implementation.
|
||||||
|
|
||||||
_Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it._
|
_Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it._
|
||||||
|
|
||||||
## Methods
|
### Transfer
|
||||||
|
|
||||||
### DOMAIN_SEPARATOR
|
|
||||||
|
|
||||||
```solidity
|
```solidity
|
||||||
function DOMAIN_SEPARATOR() external view returns (bytes32)
|
event Transfer(address from, address to, uint256 amount)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | bytes32 | undefined |
|
|
||||||
|
|
||||||
### allowance
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function allowance(address, address) external view returns (uint256)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | address | undefined |
|
|
||||||
| \_1 | address | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
### approve
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function approve(address spender, uint256 amount) external nonpayable returns (bool)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------- | ------- | ----------- |
|
|
||||||
| spender | address | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ---- | ----------- |
|
|
||||||
| \_0 | bool | undefined |
|
|
||||||
|
|
||||||
### balanceOf
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function balanceOf(address) external view returns (uint256)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | address | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
### decimals
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function decimals() external view returns (uint8)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ----- | ----------- |
|
|
||||||
| \_0 | uint8 | undefined |
|
|
||||||
|
|
||||||
### name
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function name() external view returns (string)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------ | ----------- |
|
|
||||||
| \_0 | string | undefined |
|
|
||||||
|
|
||||||
### nonces
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function nonces(address) external view returns (uint256)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | address | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
### permit
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external nonpayable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| -------- | ------- | ----------- |
|
|
||||||
| owner | address | undefined |
|
|
||||||
| spender | address | undefined |
|
|
||||||
| value | uint256 | undefined |
|
|
||||||
| deadline | uint256 | undefined |
|
|
||||||
| v | uint8 | undefined |
|
|
||||||
| r | bytes32 | undefined |
|
|
||||||
| s | bytes32 | undefined |
|
|
||||||
|
|
||||||
### symbol
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function symbol() external view returns (string)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------ | ----------- |
|
|
||||||
| \_0 | string | undefined |
|
|
||||||
|
|
||||||
### totalSupply
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function totalSupply() external view returns (uint256)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ------- | ----------- |
|
|
||||||
| \_0 | uint256 | undefined |
|
|
||||||
|
|
||||||
### transfer
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function transfer(address to, uint256 amount) external nonpayable returns (bool)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------ | ------- | ----------- |
|
|
||||||
| to | address | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ---- | ----------- |
|
|
||||||
| \_0 | bool | undefined |
|
|
||||||
|
|
||||||
### transferFrom
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
function transferFrom(address from, address to, uint256 amount) external nonpayable returns (bool)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ------ | ------- | ----------- |
|
|
||||||
| from | address | undefined |
|
|
||||||
| to | address | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ---- | ---- | ----------- |
|
|
||||||
| \_0 | bool | undefined |
|
|
||||||
|
|
||||||
## Events
|
|
||||||
|
|
||||||
### Approval
|
### Approval
|
||||||
|
|
||||||
```solidity
|
```solidity
|
||||||
event Approval(address indexed owner, address indexed spender, uint256 amount)
|
event Approval(address owner, address spender, uint256 amount)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Parameters
|
### name
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| ----------------- | ------- | ----------- |
|
|
||||||
| owner `indexed` | address | undefined |
|
|
||||||
| spender `indexed` | address | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|
||||||
### Transfer
|
|
||||||
|
|
||||||
```solidity
|
```solidity
|
||||||
event Transfer(address indexed from, address indexed to, uint256 amount)
|
string name
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Parameters
|
### symbol
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
string symbol
|
||||||
|
```
|
||||||
|
|
||||||
|
### decimals
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint8 decimals
|
||||||
|
```
|
||||||
|
|
||||||
|
### totalSupply
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 totalSupply
|
||||||
|
```
|
||||||
|
|
||||||
|
### balanceOf
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
mapping(address => uint256) balanceOf
|
||||||
|
```
|
||||||
|
|
||||||
|
### allowance
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
mapping(address => mapping(address => uint256)) allowance
|
||||||
|
```
|
||||||
|
|
||||||
|
### INITIAL_CHAIN_ID
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 INITIAL_CHAIN_ID
|
||||||
|
```
|
||||||
|
|
||||||
|
### INITIAL_DOMAIN_SEPARATOR
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
bytes32 INITIAL_DOMAIN_SEPARATOR
|
||||||
|
```
|
||||||
|
|
||||||
|
### nonces
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
mapping(address => uint256) nonces
|
||||||
|
```
|
||||||
|
|
||||||
|
### constructor
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
constructor(string _name, string _symbol, uint8 _decimals) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
### approve
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function approve(address spender, uint256 amount) public virtual returns (bool)
|
||||||
|
```
|
||||||
|
|
||||||
|
### transfer
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function transfer(address to, uint256 amount) public virtual returns (bool)
|
||||||
|
```
|
||||||
|
|
||||||
|
### transferFrom
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function transferFrom(address from, address to, uint256 amount) public virtual returns (bool)
|
||||||
|
```
|
||||||
|
|
||||||
|
### permit
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual
|
||||||
|
```
|
||||||
|
|
||||||
|
### DOMAIN_SEPARATOR
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function DOMAIN_SEPARATOR() public view virtual returns (bytes32)
|
||||||
|
```
|
||||||
|
|
||||||
|
### computeDomainSeparator
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function computeDomainSeparator() internal view virtual returns (bytes32)
|
||||||
|
```
|
||||||
|
|
||||||
|
### _mint
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _mint(address to, uint256 amount) internal virtual
|
||||||
|
```
|
||||||
|
|
||||||
|
### _burn
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _burn(address from, uint256 amount) internal virtual
|
||||||
|
```
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
| -------------- | ------- | ----------- |
|
|
||||||
| from `indexed` | address | undefined |
|
|
||||||
| to `indexed` | address | undefined |
|
|
||||||
| amount | uint256 | undefined |
|
|
||||||
|
|||||||
38
docs/lib/utils/ECDSA.md
Normal file
38
docs/lib/utils/ECDSA.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## ECDSA
|
||||||
|
|
||||||
|
Gas optimized ECDSA wrapper.
|
||||||
|
|
||||||
|
### InvalidSignature
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error InvalidSignature()
|
||||||
|
```
|
||||||
|
|
||||||
|
_The signature is invalid._
|
||||||
|
|
||||||
|
### recoverCalldata
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function recoverCalldata(bytes32 hash, bytes signature) internal view returns (address result)
|
||||||
|
```
|
||||||
|
|
||||||
|
_Recovers the signer's address from a message digest `hash`,
|
||||||
|
and the `signature`.
|
||||||
|
|
||||||
|
This function does NOT accept EIP-2098 short form signatures.
|
||||||
|
Use `recover(bytes32 hash, bytes32 r, bytes32 vs)` for EIP-2098
|
||||||
|
short form signatures instead._
|
||||||
|
|
||||||
|
### toEthSignedMessageHash
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 result)
|
||||||
|
```
|
||||||
|
|
||||||
|
_Returns an Ethereum Signed Message, created from a `hash`.
|
||||||
|
This produces a hash corresponding to the one signed with the
|
||||||
|
[`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)
|
||||||
|
JSON-RPC method as part of EIP-191._
|
||||||
|
|
||||||
@@ -1,5 +1,14 @@
|
|||||||
# MerkleProofLib
|
# Solidity API
|
||||||
|
|
||||||
_Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)_
|
## MerkleProofLib
|
||||||
|
|
||||||
Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.
|
Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.
|
||||||
|
|
||||||
|
### verify
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function verify(bytes32[] proof, bytes32 root, bytes32 leaf) internal pure returns (bool isValid)
|
||||||
|
```
|
||||||
|
|
||||||
|
_Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`._
|
||||||
|
|
||||||
|
|||||||
50
docs/lib/utils/Multicall.md
Normal file
50
docs/lib/utils/Multicall.md
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## Multicall
|
||||||
|
|
||||||
|
Contract that batches view function calls and aggregates their results.
|
||||||
|
|
||||||
|
### CallFailed
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error CallFailed(string reason)
|
||||||
|
```
|
||||||
|
|
||||||
|
_0x_
|
||||||
|
|
||||||
|
### Call
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
struct Call {
|
||||||
|
address target;
|
||||||
|
bytes callData;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Result
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
struct Result {
|
||||||
|
bool success;
|
||||||
|
bytes returnData;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### constructor
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
constructor() public payable
|
||||||
|
```
|
||||||
|
|
||||||
|
### mtc1
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function mtc1(struct Multicall.Call[] calls) external returns (uint256, bytes[])
|
||||||
|
```
|
||||||
|
|
||||||
|
### mtc2
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function mtc2(struct Multicall.Call[] calls) external returns (uint256, bytes32, struct Multicall.Result[])
|
||||||
|
```
|
||||||
|
|
||||||
@@ -1,13 +1,34 @@
|
|||||||
# ReentrancyGuard
|
# Solidity API
|
||||||
|
|
||||||
_z0r0z.ethModified from Seaport (https://github.com/ProjectOpenSea/seaport/blob/main/contracts/lib/ReentrancyGuard.sol)Modified from Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/ReentrancyGuard.sol)_
|
## ReentrancyGuard
|
||||||
|
|
||||||
Reentrancy protection for smart contracts.
|
Reentrancy protection for smart contracts.
|
||||||
|
|
||||||
## Errors
|
|
||||||
|
|
||||||
### Reentrancy
|
### Reentrancy
|
||||||
|
|
||||||
```solidity
|
```solidity
|
||||||
error Reentrancy()
|
error Reentrancy()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### nonReentrant
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
modifier nonReentrant()
|
||||||
|
```
|
||||||
|
|
||||||
|
### setReentrancyGuard
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function setReentrancyGuard() internal virtual
|
||||||
|
```
|
||||||
|
|
||||||
|
_Check guard sentinel value and set it._
|
||||||
|
|
||||||
|
### clearReentrancyGuard
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function clearReentrancyGuard() internal virtual
|
||||||
|
```
|
||||||
|
|
||||||
|
_Unset sentinel value._
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,62 @@
|
|||||||
# SafeTransferLib
|
# Solidity API
|
||||||
|
|
||||||
_Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)_
|
## SafeTransferLib
|
||||||
|
|
||||||
Safe ETH and ERC20 transfer library that gracefully handles missing return values.
|
Safe ETH and ERC20 transfer library that gracefully handles missing return values.
|
||||||
|
|
||||||
_Caution! This library won't check that a token has code, responsibility is delegated to the caller._
|
_Caution! This library won't check that a token has code, responsibility is delegated to the caller._
|
||||||
|
|
||||||
|
### ETHTransferFailed
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error ETHTransferFailed()
|
||||||
|
```
|
||||||
|
|
||||||
|
_The ETH transfer has failed._
|
||||||
|
|
||||||
|
### TransferFromFailed
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error TransferFromFailed()
|
||||||
|
```
|
||||||
|
|
||||||
|
_The ERC20 `transferFrom` has failed._
|
||||||
|
|
||||||
|
### TransferFailed
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
error TransferFailed()
|
||||||
|
```
|
||||||
|
|
||||||
|
_The ERC20 `transfer` has failed._
|
||||||
|
|
||||||
|
### safeTransferETH
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function safeTransferETH(address to, uint256 amount) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
_Sends `amount` (in wei) ETH to `to`.
|
||||||
|
Reverts upon failure._
|
||||||
|
|
||||||
|
### safeTransferFrom
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function safeTransferFrom(contract ERC20 token, address from, address to, uint256 amount) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
_Sends `amount` of ERC20 `token` from `from` to `to`.
|
||||||
|
Reverts upon failure.
|
||||||
|
|
||||||
|
The `from` account must have at least `amount` approved for
|
||||||
|
the current contract to manage._
|
||||||
|
|
||||||
|
### safeTransfer
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function safeTransfer(contract ERC20 token, address to, uint256 amount) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
_Sends `amount` of ERC20 `token` from the current contract to `to`.
|
||||||
|
Reverts upon failure._
|
||||||
|
|
||||||
|
|||||||
207
docs/p2pix.md
Normal file
207
docs/p2pix.md
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
# Solidity API
|
||||||
|
|
||||||
|
## P2PIX
|
||||||
|
|
||||||
|
### lockCounter
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
uint256 lockCounter
|
||||||
|
```
|
||||||
|
|
||||||
|
### mapLocks
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
mapping(uint256 => struct DataTypes.Lock) mapLocks
|
||||||
|
```
|
||||||
|
|
||||||
|
_List of Locks._
|
||||||
|
|
||||||
|
### userRecord
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
mapping(uint256 => uint256) userRecord
|
||||||
|
```
|
||||||
|
|
||||||
|
_Stores an relayer's last computed credit._
|
||||||
|
|
||||||
|
### constructor
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
constructor(uint256 defaultBlocks, address[] validSigners, address _reputation, contract ERC20[] tokens, bool[] tokenStates) public payable
|
||||||
|
```
|
||||||
|
|
||||||
|
### deposit
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function deposit(string pixTarget, bytes32 allowlistRoot, contract ERC20 token, uint96 amount, bool valid) public
|
||||||
|
```
|
||||||
|
|
||||||
|
Creates a deposit order based on a seller's
|
||||||
|
offer of an amount of ERC20 tokens.
|
||||||
|
Seller needs to send his tokens to the P2PIX smart contract.
|
||||||
|
|
||||||
|
_Function sighash: 0x5e918943_
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | ---- | ----------- |
|
||||||
|
| pixTarget | string | Pix key destination provided by the offer's seller. |
|
||||||
|
| allowlistRoot | bytes32 | Optional allow list merkleRoot update `bytes32` value. as the deposit identifier. |
|
||||||
|
| token | contract ERC20 | |
|
||||||
|
| amount | uint96 | |
|
||||||
|
| valid | bool | |
|
||||||
|
|
||||||
|
### setValidState
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function setValidState(contract ERC20 token, bool state) public
|
||||||
|
```
|
||||||
|
|
||||||
|
Enables seller to invalidate future
|
||||||
|
locks made to his/her token offering order.
|
||||||
|
This function does not affect any ongoing active locks.
|
||||||
|
|
||||||
|
_Function sighash: 0x6d82d9e0_
|
||||||
|
|
||||||
|
### lock
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function lock(address seller, contract ERC20 token, uint80 amount, bytes32[] merkleProof, uint256[] expiredLocks) public returns (uint256 lockID)
|
||||||
|
```
|
||||||
|
|
||||||
|
Public method designed to lock an remaining amount of
|
||||||
|
the deposit order of a seller.
|
||||||
|
Transaction forwarding must leave `merkleProof` empty;
|
||||||
|
otherwise, the trustedForwarder must be previously added
|
||||||
|
to a seller whitelist.
|
||||||
|
This method can be performed either by:
|
||||||
|
- An user allowed via the seller's allowlist;
|
||||||
|
- An user with enough userRecord to lock the wished amount;
|
||||||
|
There can only exist a lock per each `_amount` partitioned
|
||||||
|
from the total `remaining` value.
|
||||||
|
Locks can only be performed in valid orders.
|
||||||
|
|
||||||
|
_Function sighash: 0xdc43221c_
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | ---- | ----------- |
|
||||||
|
| seller | address | |
|
||||||
|
| token | contract ERC20 | |
|
||||||
|
| amount | uint80 | The deposit's remaining amount wished to be locked. |
|
||||||
|
| merkleProof | bytes32[] | Provided as a pass if the `msg.sender` is in the seller's allowlist; Left empty otherwise; |
|
||||||
|
| expiredLocks | uint256[] | An array of identifiers to be provided so to unexpire locks using this transaction gas push. |
|
||||||
|
|
||||||
|
#### Return Values
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | ---- | ----------- |
|
||||||
|
| lockID | uint256 | The lock identifier. |
|
||||||
|
|
||||||
|
### release
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function release(uint256 lockID, bytes32 pixTimestamp, bytes signature) public
|
||||||
|
```
|
||||||
|
|
||||||
|
Lock release method that liquidate lock
|
||||||
|
orders and distributes relayer fees.
|
||||||
|
This method can be called by any public actor
|
||||||
|
as long the signature provided is valid.
|
||||||
|
`relayerPremium` gets splitted equaly
|
||||||
|
if relayer addresses differ.
|
||||||
|
If the `msg.sender` of this method and `l.relayerAddress` are the same,
|
||||||
|
`msg.sender` accrues both l.amount and l.relayerPremium as userRecord credit.
|
||||||
|
In case of they differing:
|
||||||
|
- `lock` caller gets accrued with `l.amount` as userRecord credit;
|
||||||
|
- `release` caller gets accrued with `l.relayerPremium` as userRecord credit;
|
||||||
|
|
||||||
|
_Function sighash: 0x11fc7f9a_
|
||||||
|
|
||||||
|
### unlockExpired
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function unlockExpired(uint256[] lockIDs) public
|
||||||
|
```
|
||||||
|
|
||||||
|
Unlocks expired locks.
|
||||||
|
Triggered in the callgraph by both `lock` and `withdraw` functions.
|
||||||
|
This method can also have any public actor as its `tx.origin`.
|
||||||
|
For each successfull unexpired lock recovered,
|
||||||
|
`userRecord[_castAddrToKey(l.relayerAddress)]` is decreased by half of its value.
|
||||||
|
|
||||||
|
_Function sighash: 0xb0983d39_
|
||||||
|
|
||||||
|
### withdraw
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function withdraw(contract ERC20 token, uint256 amount, uint256[] expiredLocks) public
|
||||||
|
```
|
||||||
|
|
||||||
|
Seller's expired deposit fund sweeper.
|
||||||
|
A seller may use this method to recover
|
||||||
|
tokens from expired deposits.
|
||||||
|
|
||||||
|
_Function sighash: 0xfb8c5ef0_
|
||||||
|
|
||||||
|
### setRoot
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function setRoot(address addr, bytes32 merkleroot) public
|
||||||
|
```
|
||||||
|
|
||||||
|
### receive
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
receive() external payable
|
||||||
|
```
|
||||||
|
|
||||||
|
### _addLock
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function _addLock(uint256 _bal, struct DataTypes.Lock _l) internal
|
||||||
|
```
|
||||||
|
|
||||||
|
### getBalance
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function getBalance(address seller, contract ERC20 token) public view returns (uint256 bal)
|
||||||
|
```
|
||||||
|
|
||||||
|
### getValid
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function getValid(address seller, contract ERC20 token) public view returns (bool valid)
|
||||||
|
```
|
||||||
|
|
||||||
|
### getPixTarget
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function getPixTarget(address seller, contract ERC20 token) public view returns (bytes32 pixTarget)
|
||||||
|
```
|
||||||
|
|
||||||
|
### getPixTargetString
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function getPixTargetString(address seller, contract ERC20 token) public view returns (string pixTarget)
|
||||||
|
```
|
||||||
|
|
||||||
|
### getBalances
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function getBalances(address[] sellers, contract ERC20 token) external view returns (uint256[])
|
||||||
|
```
|
||||||
|
|
||||||
|
### getLocksStatus
|
||||||
|
|
||||||
|
```solidity
|
||||||
|
function getLocksStatus(uint256[] ids) external view returns (uint256[], enum DataTypes.LockStatus[])
|
||||||
|
```
|
||||||
|
|
||||||
|
External getter that returns the status of a lockIDs array.
|
||||||
|
Call will not revert if provided with an empty array as parameter.
|
||||||
|
|
||||||
|
_Function sighash: 0x49ef8448_
|
||||||
|
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
import "@nomicfoundation/hardhat-chai-matchers";
|
import "@nomicfoundation/hardhat-chai-matchers";
|
||||||
import "@nomicfoundation/hardhat-toolbox";
|
import "@nomicfoundation/hardhat-toolbox";
|
||||||
import { config as dotenvConfig } from "dotenv";
|
import { config as dotenvConfig } from "dotenv";
|
||||||
import "hardhat-tracer";
|
|
||||||
import { HardhatUserConfig } from "hardhat/config";
|
import { HardhatUserConfig } from "hardhat/config";
|
||||||
import { NetworkUserConfig } from "hardhat/types";
|
import { NetworkUserConfig } from "hardhat/types";
|
||||||
import "hardhat-contract-sizer";
|
import "hardhat-contract-sizer";
|
||||||
import { resolve } from "path";
|
import { resolve } from "path";
|
||||||
|
import "solidity-docgen";
|
||||||
|
|
||||||
dotenvConfig({ path: resolve(__dirname, "./.env") });
|
dotenvConfig({ path: resolve(__dirname, "./.env") });
|
||||||
|
|
||||||
@@ -14,14 +14,6 @@ if (!mnemonic) {
|
|||||||
throw new Error("Please set your MNEMONIC in a .env file");
|
throw new Error("Please set your MNEMONIC in a .env file");
|
||||||
}
|
}
|
||||||
|
|
||||||
const infuraApiKey: string | undefined =
|
|
||||||
process.env.INFURA_API_KEY;
|
|
||||||
if (!infuraApiKey) {
|
|
||||||
throw new Error(
|
|
||||||
"Please set your INFURA_API_KEY in a .env file",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const alchemyApiKey: string | undefined =
|
const alchemyApiKey: string | undefined =
|
||||||
process.env.ALCHEMY_API_KEY;
|
process.env.ALCHEMY_API_KEY;
|
||||||
if (!alchemyApiKey) {
|
if (!alchemyApiKey) {
|
||||||
@@ -34,25 +26,16 @@ const chainIds = {
|
|||||||
// "{INSERT_NAME}": {INSERT_ID},
|
// "{INSERT_NAME}": {INSERT_ID},
|
||||||
hardhat: 31337,
|
hardhat: 31337,
|
||||||
mainnet: 1,
|
mainnet: 1,
|
||||||
sepolia: 11155111,
|
"eth-sepolia": 11155111,
|
||||||
goerli: 5,
|
|
||||||
"polygon-mumbai": 80001,
|
"polygon-mumbai": 80001,
|
||||||
|
rootstock:30,
|
||||||
|
"rootstock-testnet":31,
|
||||||
};
|
};
|
||||||
|
|
||||||
function getChainConfig(
|
function getChainConfig(
|
||||||
chain: keyof typeof chainIds,
|
chain: keyof typeof chainIds,
|
||||||
): NetworkUserConfig {
|
): NetworkUserConfig {
|
||||||
let jsonRpcUrl: string;
|
let jsonRpcUrl = "https://" + chain + ".g.alchemy.com/v2/" + alchemyApiKey;
|
||||||
switch (chain) {
|
|
||||||
case "polygon-mumbai":
|
|
||||||
jsonRpcUrl =
|
|
||||||
"https://polygon-mumbai.g.alchemy.com/v2/" +
|
|
||||||
alchemyApiKey;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
jsonRpcUrl =
|
|
||||||
"https://" + chain + ".infura.io/v3/" + infuraApiKey;
|
|
||||||
}
|
|
||||||
return {
|
return {
|
||||||
// Comment out for default hardhat account settings
|
// Comment out for default hardhat account settings
|
||||||
accounts: {
|
accounts: {
|
||||||
@@ -81,6 +64,7 @@ const config: HardhatUserConfig = {
|
|||||||
process.env.REPORT_GAS &&
|
process.env.REPORT_GAS &&
|
||||||
process.env.REPORT_GAS != "false"
|
process.env.REPORT_GAS != "false"
|
||||||
),
|
),
|
||||||
|
offline: true,
|
||||||
showTimeSpent: true,
|
showTimeSpent: true,
|
||||||
showMethodSig: true,
|
showMethodSig: true,
|
||||||
token: "ETH",
|
token: "ETH",
|
||||||
@@ -100,9 +84,10 @@ const config: HardhatUserConfig = {
|
|||||||
},
|
},
|
||||||
// network: getChainConfig("{INSERT_NAME}"),
|
// network: getChainConfig("{INSERT_NAME}"),
|
||||||
mainnet: getChainConfig("mainnet"),
|
mainnet: getChainConfig("mainnet"),
|
||||||
goerli: getChainConfig("goerli"),
|
sepolia: getChainConfig("eth-sepolia"),
|
||||||
sepolia: getChainConfig("sepolia"),
|
mumbai: getChainConfig("polygon-mumbai"),
|
||||||
"polygon-mumbai": getChainConfig("polygon-mumbai"),
|
rootstock: getChainConfig("rootstock"),
|
||||||
|
rsktestnet: getChainConfig("rootstock-testnet"),
|
||||||
},
|
},
|
||||||
paths: {
|
paths: {
|
||||||
artifacts: "./artifacts",
|
artifacts: "./artifacts",
|
||||||
@@ -111,10 +96,10 @@ const config: HardhatUserConfig = {
|
|||||||
tests: "./test",
|
tests: "./test",
|
||||||
},
|
},
|
||||||
solidity: {
|
solidity: {
|
||||||
version: "0.8.19",
|
version: "0.8.28",
|
||||||
settings: {
|
settings: {
|
||||||
viaIR: true,
|
viaIR: true,
|
||||||
evmVersion: "paris",
|
evmVersion: "cancun",
|
||||||
optimizer: {
|
optimizer: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
runs: 20_000,
|
runs: 20_000,
|
||||||
@@ -134,8 +119,11 @@ const config: HardhatUserConfig = {
|
|||||||
},
|
},
|
||||||
typechain: {
|
typechain: {
|
||||||
outDir: "src/types",
|
outDir: "src/types",
|
||||||
target: "ethers-v5",
|
target: "ethers-v6",
|
||||||
},
|
},
|
||||||
|
docgen: {
|
||||||
|
pages: "files",
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default config;
|
export default config;
|
||||||
|
|||||||
95
package.json
95
package.json
@@ -9,10 +9,9 @@
|
|||||||
"url": "https://github.com/doiim/p2pix-smart-contracts/issues"
|
"url": "https://github.com/doiim/p2pix-smart-contracts/issues"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"clean": "shx rm -rf ./artifacts ./cache ./coverage ./src/types ./coverage.json && yarn typechain",
|
"clean": "hardhat clean",
|
||||||
"commit": "git-cz",
|
"compile": "hardhat compile",
|
||||||
"compile": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile",
|
"typechain": "hardhat typechain",
|
||||||
"typechain": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat typechain",
|
|
||||||
"test": "hardhat test",
|
"test": "hardhat test",
|
||||||
"deploy1:localhost": "hardhat run scripts/1-deploy-mockToken.ts --network localhost",
|
"deploy1:localhost": "hardhat run scripts/1-deploy-mockToken.ts --network localhost",
|
||||||
"deploy2:localhost": "hardhat run scripts/2-deploy-p2pix.ts --network localhost",
|
"deploy2:localhost": "hardhat run scripts/2-deploy-p2pix.ts --network localhost",
|
||||||
@@ -24,70 +23,50 @@
|
|||||||
"lint": "yarn lint:sol && yarn lint:ts && yarn prettier:check",
|
"lint": "yarn lint:sol && yarn lint:ts && yarn prettier:check",
|
||||||
"lint:sol": "solhint --config ./.solhint.json --max-warnings 0 \"contracts/**/*.sol\"",
|
"lint:sol": "solhint --config ./.solhint.json --max-warnings 0 \"contracts/**/*.sol\"",
|
||||||
"lint:ts": "eslint --config ./.eslintrc.yaml --ignore-path ./.eslintignore --ext .js,.ts .",
|
"lint:ts": "eslint --config ./.eslintrc.yaml --ignore-path ./.eslintignore --ext .js,.ts .",
|
||||||
"_postinstall": "husky install",
|
|
||||||
"postpublish": "pinst --enable",
|
|
||||||
"prepublishOnly": "pinst --disable",
|
|
||||||
"prettier": "prettier --config ./.prettierrc.yaml --write \"**/*.{js,json,md,sol,ts,yaml,yml}\"",
|
"prettier": "prettier --config ./.prettierrc.yaml --write \"**/*.{js,json,md,sol,ts,yaml,yml}\"",
|
||||||
"prettier:check": "prettier --check --config ./.prettierrc.yaml \"**/*.{js,json,md,sol,ts,yaml,yml}\""
|
"prettier:check": "prettier --check --config ./.prettierrc.yaml \"**/*.{js,json,md,sol,ts,yaml,yml}\""
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^17.2.0",
|
"@ethersproject/abi": "^5.8.0",
|
||||||
"@commitlint/config-conventional": "^17.2.0",
|
"@ethersproject/providers": "^5.8.0",
|
||||||
"@ethersproject/abi": "^5.7.0",
|
"@nomicfoundation/hardhat-chai-matchers": "^2.1.0",
|
||||||
"@ethersproject/abstract-signer": "^5.7.0",
|
"@nomicfoundation/hardhat-ethers": "^3.1.0",
|
||||||
"@ethersproject/bignumber": "^5.7.0",
|
"@nomicfoundation/hardhat-ignition": "^0.15.13",
|
||||||
"@ethersproject/bytes": "^5.7.0",
|
"@nomicfoundation/hardhat-ignition-ethers": "^0.15.14",
|
||||||
"@ethersproject/providers": "^5.7.2",
|
"@nomicfoundation/hardhat-network-helpers": "^1.1.0",
|
||||||
"@nomicfoundation/hardhat-chai-matchers": "^1.0.4",
|
"@nomicfoundation/hardhat-toolbox": "^6.1.0",
|
||||||
"@nomicfoundation/hardhat-network-helpers": "1.0.6",
|
"@nomicfoundation/hardhat-verify": "^2.1.0",
|
||||||
"@nomicfoundation/hardhat-toolbox": "^2.0.0",
|
"@nomicfoundation/hardhat-viem": "^2.1.0",
|
||||||
"@nomiclabs/hardhat-ethers": "^2.2.1",
|
"@nomicfoundation/ignition-core": "^0.15.13",
|
||||||
"@nomiclabs/hardhat-etherscan": "^3.1.2",
|
"@openzeppelin/contracts": "5.5.0",
|
||||||
"@trivago/prettier-plugin-sort-imports": "^3.4.0",
|
"@typechain/ethers-v6": "^0.5.1",
|
||||||
"@typechain/ethers-v5": "^10.1.1",
|
"@typechain/hardhat": "^9.1.0",
|
||||||
"@typechain/hardhat": "^6.1.4",
|
"@types/chai": "^4.3.20",
|
||||||
"@types/chai": "^4.3.3",
|
"@types/mocha": "^10.0.10",
|
||||||
"@types/fs-extra": "^9.0.13",
|
"@types/node": "^24.1.0",
|
||||||
"@types/mocha": "^9.1.1",
|
"chai": "4.5.0",
|
||||||
"@types/node": "^18.11.9",
|
"dotenv": "^16.6.1",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.42.0",
|
"eslint": "^9.32.0",
|
||||||
"@typescript-eslint/parser": "^5.42.0",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"chai": "^4.3.6",
|
"ethers": "^6.15.0",
|
||||||
"chalk": "4.x",
|
"hardhat": "^2.26.1",
|
||||||
"commitizen": "^4.2.5",
|
"hardhat-contract-sizer": "^2.10.0",
|
||||||
"cross-env": "^7.0.3",
|
"hardhat-gas-reporter": "^2.3.0",
|
||||||
"cz-conventional-changelog": "^3.3.0",
|
|
||||||
"dotenv": "^16.0.3",
|
|
||||||
"eslint": "^8.26.0",
|
|
||||||
"eslint-config-prettier": "^8.5.0",
|
|
||||||
"ethers": "^5.7.2",
|
|
||||||
"fs-extra": "^10.1.0",
|
|
||||||
"hardhat": "^2.12.2",
|
|
||||||
"hardhat-contract-sizer": "^2.8.0",
|
|
||||||
"hardhat-gas-reporter": "^1.0.9",
|
|
||||||
"hardhat-tracer": "beta",
|
|
||||||
"husky": "^8.0.1",
|
|
||||||
"keccak256": "^1.0.6",
|
"keccak256": "^1.0.6",
|
||||||
"lint-staged": "^13.0.3",
|
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"merkletreejs": "^0.2.32",
|
"merkletreejs": "^0.5.2",
|
||||||
"mocha": "^10.1.0",
|
"mocha": "^10.8.2",
|
||||||
"pinst": "^3.0.0",
|
"solidity-coverage": "^0.8.16",
|
||||||
"prettier": "^2.7.1",
|
"solidity-docgen": "^0.6.0-beta.36",
|
||||||
"prettier-plugin-solidity": "^1.0.0-rc.1",
|
"ts-node": "^10.9.2",
|
||||||
"shx": "^0.3.4",
|
"typechain": "^8.3.2",
|
||||||
"solhint": "^3.3.7",
|
"typescript": "^5.8.3",
|
||||||
"solhint-plugin-prettier": "^0.0.5",
|
"viem": "^2.33.1"
|
||||||
"solidity-coverage": "^0.8.2",
|
|
||||||
"ts-generator": "^0.1.1",
|
|
||||||
"ts-node": "^10.9.1",
|
|
||||||
"typechain": "^8.1.1",
|
|
||||||
"typescript": "^4.8.4"
|
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"/contracts"
|
"/contracts"
|
||||||
],
|
],
|
||||||
"packageManager": "yarn@3.2.1",
|
"packageManager": "yarn@4.9.2",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
import "@nomiclabs/hardhat-ethers";
|
import "@nomicfoundation/hardhat-ethers";
|
||||||
import "@nomiclabs/hardhat-etherscan";
|
|
||||||
import { BigNumber } from "ethers";
|
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { ethers, network } from "hardhat";
|
import { ethers, network } from "hardhat";
|
||||||
import hre from "hardhat";
|
|
||||||
|
|
||||||
import { Deploys } from "../test/utils/interfaces";
|
import { Deploys } from "../test/utils/interfaces";
|
||||||
|
|
||||||
let deploysJson: Deploys;
|
let deploysJson: Deploys;
|
||||||
const supply: BigNumber = ethers.utils.parseEther("20000000");
|
const supply: BigInt = ethers.parseEther("20000000");
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
try {
|
try {
|
||||||
@@ -25,15 +22,11 @@ const main = async () => {
|
|||||||
const [deployer] = await ethers.getSigners();
|
const [deployer] = await ethers.getSigners();
|
||||||
console.log(`Deploying contracts with ${deployer.address}`);
|
console.log(`Deploying contracts with ${deployer.address}`);
|
||||||
|
|
||||||
const ERC20Factory = await ethers.getContractFactory(
|
let erc20 = await ethers.deployContract("MockToken", [supply]);
|
||||||
"MockToken",
|
erc20 = await erc20.waitForDeployment();
|
||||||
);
|
|
||||||
const erc20 = await ERC20Factory.deploy(supply);
|
|
||||||
await erc20.deployed();
|
|
||||||
|
|
||||||
deploysJson.token = erc20.address;
|
deploysJson.token = await erc20.getAddress();
|
||||||
console.log("🚀 Mock Token Deployed:", erc20.address);
|
console.log("🚀 Mock Token Deployed:", await erc20.getAddress());
|
||||||
await erc20.deployTransaction.wait(6);
|
|
||||||
|
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
`./deploys/${network.name}.json`,
|
`./deploys/${network.name}.json`,
|
||||||
@@ -42,10 +35,10 @@ const main = async () => {
|
|||||||
|
|
||||||
/* UNCOMMENT WHEN DEPLOYING TO MAINNET/PUBLIC TESTNETS */
|
/* UNCOMMENT WHEN DEPLOYING TO MAINNET/PUBLIC TESTNETS */
|
||||||
// verify
|
// verify
|
||||||
await hre.run("verify:verify", {
|
// await hre.run("verify:verify", {
|
||||||
address: erc20.address,
|
// address: erc20.address,
|
||||||
constructorArguments: [supply],
|
// constructorArguments: [supply],
|
||||||
});
|
// });
|
||||||
};
|
};
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import "@nomiclabs/hardhat-ethers";
|
import "@nomicfoundation/hardhat-ethers";
|
||||||
import "@nomiclabs/hardhat-etherscan";
|
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { ethers, network } from "hardhat";
|
import { ethers, network } from "hardhat";
|
||||||
import hre from "hardhat";
|
|
||||||
|
|
||||||
import { Deploys } from "../test/utils/interfaces";
|
import { Deploys } from "../test/utils/interfaces";
|
||||||
|
|
||||||
@@ -23,32 +21,24 @@ const main = async () => {
|
|||||||
const [deployer] = await ethers.getSigners();
|
const [deployer] = await ethers.getSigners();
|
||||||
console.log(`Deploying contracts with ${deployer.address}`);
|
console.log(`Deploying contracts with ${deployer.address}`);
|
||||||
|
|
||||||
const Reputation = await ethers.getContractFactory(
|
let reputation = await ethers.deployContract("Reputation");
|
||||||
"Reputation",
|
let multicall = await ethers.deployContract("Multicall");
|
||||||
);
|
let p2pix = await ethers.deployContract("P2PIX", [
|
||||||
const Multicall = await ethers.getContractFactory(
|
|
||||||
"Multicall",
|
|
||||||
);
|
|
||||||
const reputation = await Reputation.deploy();
|
|
||||||
await reputation.deployed();
|
|
||||||
const mutlicall = await Multicall.deploy();
|
|
||||||
await mutlicall.deployed();
|
|
||||||
|
|
||||||
const P2PIX = await ethers.getContractFactory("P2PIX");
|
|
||||||
const p2pix = await P2PIX.deploy(
|
|
||||||
10,
|
10,
|
||||||
deploysJson.signers,
|
deploysJson.signers,
|
||||||
reputation.address,
|
reputation.target,
|
||||||
[deploysJson.token],
|
[deploysJson.token],
|
||||||
[true],
|
[true],
|
||||||
);
|
]);
|
||||||
await p2pix.deployed();
|
|
||||||
|
|
||||||
deploysJson.p2pix = p2pix.address;
|
reputation = await reputation.waitForDeployment();
|
||||||
console.log("🚀 P2PIX Deployed:", p2pix.address);
|
multicall = await multicall.waitForDeployment();
|
||||||
console.log("🌠 Reputation Deployed:", reputation.address);
|
p2pix = await p2pix.waitForDeployment();
|
||||||
console.log("🛰 Multicall Deployed:", mutlicall.address);
|
|
||||||
await p2pix.deployTransaction.wait(6);
|
deploysJson.p2pix = await p2pix.getAddress();
|
||||||
|
console.log("🚀 P2PIX Deployed:", await p2pix.getAddress());
|
||||||
|
console.log("🌠 Reputation Deployed:", await reputation.getAddress());
|
||||||
|
console.log("🛰 Multicall Deployed:", await multicall.getAddress());
|
||||||
|
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
`./deploys/${network.name}.json`,
|
`./deploys/${network.name}.json`,
|
||||||
@@ -57,24 +47,24 @@ const main = async () => {
|
|||||||
|
|
||||||
/* UNCOMMENT WHEN DEPLOYING TO MAINNET/PUBLIC TESTNETS */
|
/* UNCOMMENT WHEN DEPLOYING TO MAINNET/PUBLIC TESTNETS */
|
||||||
//verify
|
//verify
|
||||||
await hre.run("verify:verify", {
|
// await hre.run("verify:verify", {
|
||||||
address: p2pix.address,
|
// address: p2pix.address,
|
||||||
constructorArguments: [
|
// constructorArguments: [
|
||||||
10,
|
// 10,
|
||||||
deploysJson.signers,
|
// deploysJson.signers,
|
||||||
reputation.address,
|
// reputation.address,
|
||||||
[deploysJson.token],
|
// [deploysJson.token],
|
||||||
[true],
|
// [true],
|
||||||
],
|
// ],
|
||||||
});
|
// });
|
||||||
await hre.run("verify:verify", {
|
// await hre.run("verify:verify", {
|
||||||
address: reputation.address,
|
// address: reputation.address,
|
||||||
constructorArguments: [],
|
// constructorArguments: [],
|
||||||
});
|
// });
|
||||||
await hre.run("verify:verify", {
|
// await hre.run("verify:verify", {
|
||||||
address: mutlicall.address,
|
// address: mutlicall.address,
|
||||||
constructorArguments: [],
|
// constructorArguments: [],
|
||||||
});
|
// });
|
||||||
};
|
};
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import "@nomicfoundation/hardhat-chai-matchers";
|
import "@nomicfoundation/hardhat-chai-matchers";
|
||||||
import { loadFixture } from "@nomicfoundation/hardhat-network-helpers";
|
import { loadFixture } from "@nomicfoundation/hardhat-network-helpers";
|
||||||
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";
|
import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers";
|
||||||
import { expect } from "chai";
|
import { expect } from "chai";
|
||||||
import { ethers, network } from "hardhat";
|
import { ethers, network } from "hardhat";
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ describe("Reputation", () => {
|
|||||||
|
|
||||||
before("Set signers and reset network", async () => {
|
before("Set signers and reset network", async () => {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
[owner] = await (ethers as any).getSigners();
|
[owner] = await ethers.getSigners();
|
||||||
|
|
||||||
await network.provider.send("hardhat_reset");
|
await network.provider.send("hardhat_reset");
|
||||||
});
|
});
|
||||||
@@ -60,7 +60,7 @@ describe("Reputation", () => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
x: Number.MAX_SAFE_INTEGER,
|
x: Number.MAX_SAFE_INTEGER,
|
||||||
shouldRevert: "overflow",
|
expected: curve(Number.MAX_SAFE_INTEGER),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
x: Number.POSITIVE_INFINITY,
|
x: Number.POSITIVE_INFINITY,
|
||||||
|
|||||||
1099
test/p2pix.test.ts
1099
test/p2pix.test.ts
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";
|
import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers";
|
||||||
import { BigNumber, Signer } from "ethers";
|
import { Signer } from "ethers";
|
||||||
import { ethers } from "hardhat";
|
import { ethers } from "hardhat";
|
||||||
import keccak256 from "keccak256";
|
import keccak256 from "keccak256";
|
||||||
import { MerkleTree } from "merkletreejs";
|
import { MerkleTree } from "merkletreejs";
|
||||||
@@ -14,30 +14,7 @@ import {
|
|||||||
|
|
||||||
import { Call, RepFixture, P2PixAndReputation, DepositArgs, LockArgs, ReleaseArgs } from "./interfaces";
|
import { Call, RepFixture, P2PixAndReputation, DepositArgs, LockArgs, ReleaseArgs } from "./interfaces";
|
||||||
|
|
||||||
|
|
||||||
// exported constants
|
// exported constants
|
||||||
export const createDepositArgs = (pixTarget: string, allowlistRoot: string, token: string, amount: BigNumber, valid:boolean): DepositArgs => ({
|
|
||||||
pixTarget,
|
|
||||||
allowlistRoot,
|
|
||||||
token,
|
|
||||||
amount,
|
|
||||||
valid,
|
|
||||||
});
|
|
||||||
|
|
||||||
export const createLockArgs = (seller: string, token: string, amount: BigNumber, merkleProof: string[], expiredLocks: BigNumber[]): LockArgs => ({
|
|
||||||
seller,
|
|
||||||
token,
|
|
||||||
amount,
|
|
||||||
merkleProof,
|
|
||||||
expiredLocks,
|
|
||||||
});
|
|
||||||
|
|
||||||
export const createReleaseArgs = (lockID: BigNumber, pixTimestamp: string, signature: string): ReleaseArgs => ({
|
|
||||||
lockID,
|
|
||||||
pixTimestamp,
|
|
||||||
signature,
|
|
||||||
});
|
|
||||||
|
|
||||||
export const getSignerAddrs = (
|
export const getSignerAddrs = (
|
||||||
amount: number,
|
amount: number,
|
||||||
addrs: SignerWithAddress[],
|
addrs: SignerWithAddress[],
|
||||||
@@ -45,16 +22,16 @@ export const getSignerAddrs = (
|
|||||||
return addrs.slice(0, amount).map(({ address }) => address);
|
return addrs.slice(0, amount).map(({ address }) => address);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getBnFrom = (nums: number[]): BigNumber[] => {
|
export const getBnFrom = (nums: number[]): BigInt[] => {
|
||||||
const bns = nums.map(num => ethers.BigNumber.from(num));
|
const bns = nums.map(num => BigInt(num));
|
||||||
return bns;
|
return bns;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getLockData = (
|
export const getLockData = (
|
||||||
addr: string,
|
addr: string,
|
||||||
locks: BigNumber[][],
|
locks: BigInt[][],
|
||||||
): Call[] => {
|
): Call[] => {
|
||||||
const iface = new ethers.utils.Interface(
|
const iface = new ethers.Interface(
|
||||||
P2PIX__factory.abi,
|
P2PIX__factory.abi,
|
||||||
);
|
);
|
||||||
return locks.map(lock => ({
|
return locks.map(lock => ({
|
||||||
@@ -94,13 +71,8 @@ export const curve = (x: number): number => {
|
|||||||
|
|
||||||
// exported async functions
|
// exported async functions
|
||||||
export async function repFixture(): Promise<RepFixture> {
|
export async function repFixture(): Promise<RepFixture> {
|
||||||
const Reputation = await ethers.getContractFactory(
|
const reputation = await ethers.deployContract("Reputation");
|
||||||
"Reputation",
|
return { reputation: await reputation.waitForDeployment() };
|
||||||
);
|
|
||||||
const reputation =
|
|
||||||
(await Reputation.deploy()) as Reputation;
|
|
||||||
|
|
||||||
return { reputation };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function p2pixFixture(): Promise<P2PixAndReputation> {
|
export async function p2pixFixture(): Promise<P2PixAndReputation> {
|
||||||
@@ -109,30 +81,21 @@ export async function p2pixFixture(): Promise<P2PixAndReputation> {
|
|||||||
await ethers.getSigners(),
|
await ethers.getSigners(),
|
||||||
);
|
);
|
||||||
|
|
||||||
const Reputation = await ethers.getContractFactory(
|
const reputation = await ethers.deployContract("Reputation");
|
||||||
"Reputation",
|
|
||||||
);
|
|
||||||
const reputation =
|
|
||||||
(await Reputation.deploy()) as Reputation;
|
|
||||||
|
|
||||||
const ERC20 = await ethers.getContractFactory("MockToken");
|
const erc20 = await ethers.deployContract("MockToken", [
|
||||||
const erc20 = (await ERC20.deploy(
|
ethers.parseEther("20000000") // 20M
|
||||||
ethers.utils.parseEther("20000000"), // 20M
|
]) as MockToken;
|
||||||
)) as MockToken;
|
|
||||||
|
|
||||||
const P2PIX = await ethers.getContractFactory("P2PIX");
|
const p2pix = await ethers.deployContract("P2PIX", [
|
||||||
const p2pix = (await P2PIX.deploy(
|
|
||||||
10,
|
10,
|
||||||
validSigners,
|
validSigners,
|
||||||
reputation.address,
|
reputation.target,
|
||||||
[erc20.address],
|
[erc20.target],
|
||||||
[true],
|
[true],
|
||||||
)) as P2PIX;
|
]);
|
||||||
|
|
||||||
const Multicall = await ethers.getContractFactory(
|
const multicall = await ethers.deployContract("Multicall");
|
||||||
"Multicall",
|
|
||||||
);
|
|
||||||
const multicall = (await Multicall.deploy()) as Multicall;
|
|
||||||
|
|
||||||
const signers = await ethers.getSigners();
|
const signers = await ethers.getSigners();
|
||||||
const whitelisted = signers.slice(0, 2);
|
const whitelisted = signers.slice(0, 2);
|
||||||
@@ -148,10 +111,10 @@ export async function p2pixFixture(): Promise<P2PixAndReputation> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
multicall,
|
multicall: await multicall.waitForDeployment(),
|
||||||
reputation,
|
reputation: await reputation.waitForDeployment(),
|
||||||
erc20,
|
erc20: await erc20.waitForDeployment(),
|
||||||
p2pix,
|
p2pix: await p2pix.waitForDeployment(),
|
||||||
merkleRoot,
|
merkleRoot,
|
||||||
proof,
|
proof,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { BigNumber } from "ethers";
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
MockToken,
|
MockToken,
|
||||||
Multicall,
|
Multicall,
|
||||||
@@ -19,29 +17,29 @@ export interface DepositArgs {
|
|||||||
pixTarget: string;
|
pixTarget: string;
|
||||||
allowlistRoot: string;
|
allowlistRoot: string;
|
||||||
token: string;
|
token: string;
|
||||||
amount: BigNumber;
|
amount: BigInt;
|
||||||
valid: boolean;
|
valid: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LockArgs {
|
export interface LockArgs {
|
||||||
seller: string;
|
seller: string;
|
||||||
token: string;
|
token: string;
|
||||||
amount: BigNumber;
|
amount: BigInt;
|
||||||
merkleProof: string[];
|
merkleProof: string[];
|
||||||
expiredLocks: BigNumber[];
|
expiredLocks: BigInt[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ReleaseArgs {
|
export interface ReleaseArgs {
|
||||||
lockID: BigNumber;
|
lockID: BigInt;
|
||||||
pixTimestamp: string;
|
pixTimestamp: string;
|
||||||
signature: string;
|
signature: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Lock {
|
export interface Lock {
|
||||||
counter: BigNumber;
|
counter: BigInt;
|
||||||
expirationBlock: BigNumber;
|
expirationBlock: BigInt;
|
||||||
pixTarget: string;
|
pixTarget: string;
|
||||||
amount: BigNumber;
|
amount: BigInt;
|
||||||
token: string;
|
token: string;
|
||||||
buyerAddress: string;
|
buyerAddress: string;
|
||||||
seller: string;
|
seller: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user