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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .cache-1337.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"forwarder": {
"txHash": "0xabceffacd191849a635434f71c6c4e0965eb4f05e13057f524d3704f029b3a15",
"address": "0x5FbDB2315678afecb367f032d93F642f64180aa3"
},
"manager": {
"txHash": "0xc9d0611a94201902bb80b04482f93ad3cc6a45d483ccd0b655a9300dae717379",
"address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0"
},
"redemption": {
"txHash": "0xca788e0f2bb12a67c857eca73431b059a35fea453294d6050fccbbb17ac7cf3c",
"address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9"
},
"minter": {
"txHash": "0x8fa6badfd083a8a7efd8a6a0188d0535379be2372c386ffb95b76ad2019f6b94",
"address": "0x0165878A594ca255338adfa4d48449f69242Eb8F"
},
"archiver": {
"txHash": "0xdc71d9a09c4dc2fc2e98780b5acb290a85bfeeff1f51f63a281a745d23557181",
"address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6"
},
"token-EUTB": {
"txHash": "0x146d1c10933360a7f8014022314068194a4c6ae1bee886cbce22860ff029b0f5",
"address": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788"
},
"oracle-EUTB": {
"txHash": "0xa0c548c53c733beada35289131e930cf58a5d8320cbf070b4ad8aa60ef993d4e",
"address": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0"
},
"token-USTB": {
"txHash": "0xd4723b4c25578d7217e2f42439e99b0d4bd453a909311b64ae92ad659e01e02f",
"address": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82"
},
"oracle-USTB": {
"txHash": "0xd25749e9d7a74d0763adc3441b064b3e1a5b9a2a4285b54dfb3cfaba047d481b",
"address": "0x9A676e781A523b5d0C0e43731313A708CB607508"
},
"token-eurUSTB": {
"txHash": "0xe5d58b270f1e5c9b6518a3a72d8a273423ff12463ef8194880af868ff17f80ad",
"address": "0x0B306BF915C4d645ff596e518fAf3F9669b97016"
},
"oracle-eurUSTB": {
"txHash": "0x524103cbb7ae4d740021e86e3fb2b83722043557fd97023f06e60e3e84d98610",
"address": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1"
}
}
48 changes: 48 additions & 0 deletions contracts/archiver/Archiver.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import { UUPSUpgradeable } from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
import { Multicall } from "@openzeppelin/contracts/utils/Multicall.sol";
import { IAuthority, PermissionManaged } from "../permissions/PermissionManaged.sol";
import { EventArchiveAmendable } from "@spiko/erc-cross-chain-event-archive/src/EventArchiveAmendable.sol";
import { IEventArchiveWriter } from "@spiko/erc-cross-chain-event-archive/src/interfaces/IEventArchiveWriter.sol";
import { IEventArchiveAmender } from "@spiko/erc-cross-chain-event-archive/src/interfaces/IEventArchiveAmender.sol";

contract Archiver is EventArchiveAmendable, IEventArchiveWriter, PermissionManaged, UUPSUpgradeable, Multicall {
/// @custom:oz-upgrades-unsafe-allow constructor
constructor(IAuthority _authority) PermissionManaged(_authority) {}

function archiveEvent(
string calldata sourceChainId,
bytes32 sourceTxHash,
bytes32 sourceAddress,
uint256 sourceLogIndex,
uint256 sourceBlockNumber,
bytes calldata payload
) external restricted {
_archiveEvent(sourceChainId, sourceTxHash, sourceAddress, sourceLogIndex, sourceBlockNumber, payload);
}

function amendEvent(
bytes32 sourceChainIdHash,
bytes32 sourceTxHash,
uint256 sourceLogIndex,
bytes calldata payload
) external restricted {
_amendEvent(sourceChainIdHash, sourceTxHash, sourceLogIndex, payload);
}

/// @inheritdoc IERC165
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
return interfaceId == type(IEventArchiveWriter).interfaceId || super.supportsInterface(interfaceId);
}

/****************************************************************************************************************
* UUPS upgrade *
****************************************************************************************************************/
function _authorizeUpgrade(address) internal view override {
_checkRestricted(UUPSUpgradeable.upgradeToAndCall.selector);
}
}
2 changes: 1 addition & 1 deletion contracts/import.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

pragma solidity ^0.8.20;

import { ERC2771Forwarder } from "@openzeppelin/contracts/metatx/ERC2771Forwarder.sol";
import { ERC2771Forwarder } from "@openzeppelin/contracts/metatx/ERC2771Forwarder.sol";
10 changes: 3 additions & 7 deletions contracts/mocks/ERC1363ReceiverMock.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
pragma solidity ^0.8.0;

import { IERC1363Receiver } from "@openzeppelin/contracts/interfaces/IERC1363Receiver.sol";
import { IERC1363Spender } from "@openzeppelin/contracts/interfaces/IERC1363Spender.sol";
import { IERC1363Spender } from "@openzeppelin/contracts/interfaces/IERC1363Spender.sol";

contract ERC1363ReceiverMock is IERC1363Receiver, IERC1363Spender {
event TransferReceived(address operator, address from, uint256 value, bytes data);
Expand All @@ -28,11 +28,7 @@ contract ERC1363ReceiverMock is IERC1363Receiver, IERC1363Spender {
return this.onTransferReceived.selector;
}

function onApprovalReceived(
address owner,
uint256 value,
bytes memory data
) external override returns (bytes4) {
function onApprovalReceived(address owner, uint256 value, bytes memory data) external override returns (bytes4) {
if (data.length == 1) {
if (data[0] == 0x00) {
revert("onApprovalReceived revert");
Expand All @@ -45,4 +41,4 @@ contract ERC1363ReceiverMock is IERC1363Receiver, IERC1363Spender {
emit ApprovalReceived(owner, value, data);
return this.onApprovalReceived.selector;
}
}
}
6 changes: 4 additions & 2 deletions contracts/mocks/ERC20DecimalsMock.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract ERC20DecimalsMock is ERC20("Mock Token Decimals", "MockD") {
uint8 internal immutable _decimals;

constructor(uint8 decimals_) { _decimals = decimals_; }
constructor(uint8 decimals_) {
_decimals = decimals_;
}

function decimals() public view override returns (uint8) {
return _decimals;
Expand All @@ -20,4 +22,4 @@ contract ERC20DecimalsMock is ERC20("Mock Token Decimals", "MockD") {
function burn(address to, uint256 value) external {
_burn(to, value);
}
}
}
2 changes: 1 addition & 1 deletion contracts/mocks/ERC20Mock.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ contract ERC20Mock is ERC20("Mock Token", "Mock") {
function burn(address to, uint256 value) external {
_burn(to, value);
}
}
}
68 changes: 26 additions & 42 deletions contracts/oracle/Oracle.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,25 @@
pragma solidity ^0.8.20;

import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
import { IAuthority } from "@openzeppelin/contracts/access/manager/IAuthority.sol";
import { IERC20Metadata } from "@openzeppelin/contracts/interfaces/IERC20Metadata.sol";
import { UUPSUpgradeable } from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol";
import { Checkpoints } from "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
import { Multicall } from "@openzeppelin/contracts/utils/Multicall.sol";
import { PermissionManaged } from "../permissions/PermissionManaged.sol";
import { IAuthority } from "@openzeppelin/contracts/access/manager/IAuthority.sol";
import { IERC20Metadata } from "@openzeppelin/contracts/interfaces/IERC20Metadata.sol";
import { UUPSUpgradeable } from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol";
import { Checkpoints } from "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
import { Multicall } from "@openzeppelin/contracts/utils/Multicall.sol";
import { PermissionManaged } from "../permissions/PermissionManaged.sol";

/// @custom:security-contact security@spiko.tech
contract Oracle is
AggregatorV3Interface,
Initializable,
PermissionManaged,
UUPSUpgradeable,
Multicall
{
using Checkpoints for Checkpoints.Trace208;
using SafeCast for *;

IERC20Metadata public token;
uint256 public constant version = 0;
uint8 public decimals;
string public description; // set per-instance at initialization
Checkpoints.Trace208 private _history;
contract Oracle is AggregatorV3Interface, Initializable, PermissionManaged, UUPSUpgradeable, Multicall {
using Checkpoints for Checkpoints.Trace208;
using SafeCast for *;

IERC20Metadata public token;
uint256 public constant version = 0;
uint8 public decimals;
string public description; // set per-instance at initialization
Checkpoints.Trace208 private _history;

event Update(uint48 timepoint, int256 price, uint256 round);

Expand All @@ -36,9 +30,9 @@ contract Oracle is
_disableInitializers();
}

function initialize(IERC20Metadata _token, uint8 _decimals, string calldata denomination) public initializer() {
token = _token;
decimals = _decimals;
function initialize(IERC20Metadata _token, uint8 _decimals, string calldata denomination) public initializer {
token = _token;
decimals = _decimals;
description = string.concat(_token.symbol(), " / ", denomination);
}

Expand All @@ -55,7 +49,7 @@ contract Oracle is

// Note: we are not using block.timestamp for the timepoint because of the mining delay for the update transaction
// and the fact that prices represent a value at a specific "update" time (according to regulation).
function publishPrice(uint48 timepoint, uint208 price) public restricted() returns (uint80) {
function publishPrice(uint48 timepoint, uint208 price) public restricted returns (uint80) {
uint80 roundId = _history.length().toUint80();
_history.push(timepoint, price);

Expand All @@ -71,16 +65,12 @@ contract Oracle is
// function decimals() public pure returns (uint8); -- implemented by a public variable
// function description() public view returns (string memory); -- implemented by a public variable

function getRoundData(uint80 _roundId)
function getRoundData(
uint80 _roundId
)
public
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
{
require(_roundId < _history.length(), "No checkpoint for roundId");
Checkpoints.Checkpoint208 memory ckpt = _history._checkpoints[_roundId];
Expand All @@ -97,13 +87,7 @@ contract Oracle is
function latestRoundData()
public
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
{
return getRoundData(_history.length().toUint80() - 1);
}
Expand Down
33 changes: 16 additions & 17 deletions contracts/permissions/PermissionManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,25 @@

pragma solidity ^0.8.20;

import { IAuthority } from "@openzeppelin/contracts/access/manager/IAuthority.sol";
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import { IAuthority } from "@openzeppelin/contracts/access/manager/IAuthority.sol";
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import { UUPSUpgradeable } from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
import { Multicall } from "@openzeppelin/contracts/utils/Multicall.sol";
import { Masks } from "../utils/Masks.sol";
import { Multicall } from "@openzeppelin/contracts/utils/Multicall.sol";
import { Masks } from "../utils/Masks.sol";

/// @custom:security-contact security@spiko.tech
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
contract PermissionManager is
IAuthority,
Initializable,
UUPSUpgradeable,
Multicall
{
contract PermissionManager is IAuthority, Initializable, UUPSUpgradeable, Multicall {
using Masks for *;

uint8 public constant ADMIN = 0x00;
uint8 public constant PUBLIC = 0xFF;
Masks.Mask public immutable ADMIN_MASK = ADMIN.toMask();
uint8 public constant ADMIN = 0x00;
uint8 public constant PUBLIC = 0xFF;
Masks.Mask public immutable ADMIN_MASK = ADMIN.toMask();
Masks.Mask public immutable PUBLIC_MASK = PUBLIC.toMask();

mapping(address => Masks.Mask ) private _permissions;
mapping(address => Masks.Mask) private _permissions;
mapping(address => mapping(bytes4 => Masks.Mask)) private _restrictions;
mapping(uint8 => Masks.Mask ) private _admin;
mapping(uint8 => Masks.Mask) private _admin;

event GroupAdded(address indexed user, uint8 indexed group);
event GroupRemoved(address indexed user, uint8 indexed group);
Expand All @@ -49,7 +44,7 @@ contract PermissionManager is
_disableInitializers();
}

function initialize(address admin) public initializer() {
function initialize(address admin) public initializer {
_addGroup(admin, 0);
}

Expand Down Expand Up @@ -100,7 +95,11 @@ contract PermissionManager is
}

// Requirement management
function setRequirements(address target, bytes4[] calldata selectors, uint8[] calldata groups) public onlyRole(ADMIN_MASK) {
function setRequirements(
address target,
bytes4[] calldata selectors,
uint8[] calldata groups
) public onlyRole(ADMIN_MASK) {
Masks.Mask mask = groups.toMask();
for (uint256 i = 0; i < selectors.length; ++i) {
_setRequirements(target, selectors[i], mask);
Expand Down
Loading
Loading