Skip to content
Merged
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
62 changes: 62 additions & 0 deletions multisig-proposals/05-update-retirecmark-facet.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import SafeApiKit from "@safe-global/api-kit";
import Safe from "@safe-global/protocol-kit";
import {
MetaTransactionData,
OperationType,
} from "@safe-global/safe-core-sdk-types";

const RPC_URL = process.env.POLYGON_URL;
const SAFE_ADDRESS = process.env.CONTRACT_MULTISIG;
const OWNER_1_PRIVATE_KEY = process.env.PRIVATE_KEY;
const OWNER_1_ADDRESS = process.env.PUBLIC_KEY;
const RETIREMENT_AGGREGATOR = process.env.RETIREMENT_AGGREGATOR;

// Sepolia for testing
const apiKit = new SafeApiKit({
chainId: 137n,
});

if (
!RPC_URL ||
!OWNER_1_PRIVATE_KEY ||
!OWNER_1_ADDRESS ||
!SAFE_ADDRESS ||
!RETIREMENT_AGGREGATOR
) {
throw new Error("Missing environment variables");
}

const protocolKitOwner1 = await Safe.init({
provider: RPC_URL,
signer: OWNER_1_PRIVATE_KEY,
safeAddress: SAFE_ADDRESS,
});

// Create transaction
const safeTransactionData: MetaTransactionData = {
to: RETIREMENT_AGGREGATOR,
value: "0",
data: "0x1f931c1c0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000085f50d58d89d83a8a390379b4b07f060f85faeb100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000174deb0be000000000000000000000000000000000000000000000000000000000000000000000000000000007778bd8a404ffb91b2433552a9d02895d9eb1b46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001dc3ca95c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", // txn call data generated by running upgrade script
operation: OperationType.Call,
};

const nextNonce = await apiKit.getNextNonce(SAFE_ADDRESS);

const safeTransaction = await protocolKitOwner1.createTransaction({
transactions: [safeTransactionData],
options: {
nonce: nextNonce,
},
});

const safeTxHash = await protocolKitOwner1.getTransactionHash(safeTransaction);
const signature = await protocolKitOwner1.signHash(safeTxHash);

// Propose transaction to the service
await apiKit.proposeTransaction({
safeAddress: SAFE_ADDRESS,
safeTransactionData: safeTransaction.data,
safeTxHash,
senderAddress: OWNER_1_ADDRESS,
senderSignature: signature.data,
});
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,13 @@
"test:upgrade-native-usdc": "forge test --fork-url http://localhost:8545 -vvvv --ffi --match-contract UpgradeInfinityForNativeUsdcTest --summary",
"test:upgrade-native-usdc-revisions": "forge test --fork-url http://localhost:8545 -vvvv --ffi --match-contract UpgradeInfinityForNativeUsdcRevisionsTest --summary",
"test:upgrade-return-trade-dust": "forge test --fork-url http://localhost:8545 -vvvv --ffi --match-contract UpgradeInfinityForTradeDustRevisionsTest --summary",
"test:upgrade-cmark": "forge test --fork-url http://localhost:8545 -vvvv --ffi --match-contract UpgradeInfinityForCMARKCredits --summary",
"propose:01_update_swap_routes": "bun multisig-proposals/01-update-swap-routes.ts",
"propose:02_update_retiremark_facet": "bun multisig-proposals/02-update-retirecarbonmark-facet.ts",
"propose:03_update_native_usdc_revisions": "bun multisig-proposals/03-update-native-usdc-revisions.ts",
"propose:04_update_returnTradeDust_revisions": "bun multisig-proposals/04-update-returnTradeDust-revisions.ts"
"propose:04_update_returnTradeDust_revisions": "bun multisig-proposals/04-update-returnTradeDust-revisions.ts",
"propose:05_update_retirecmark_facet": "bun multisig-proposals/05-update-retirecmark-facet.ts"

},
"repository": {
"type": "git",
Expand Down
74 changes: 74 additions & 0 deletions script/6_upgradeInfinityForCMARK.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "forge-std/Script.sol";
import {console2} from "forge-std/console2.sol";

import "../src/infinity/interfaces/IDiamondCut.sol";
import {Diamond} from "../src/infinity/Diamond.sol";
import "../src/infinity/facets/DiamondCutFacet.sol";
import "../src/infinity/facets/DiamondLoupeFacet.sol";
import "../src/infinity/facets/OwnershipFacet.sol";
import { RetireCarbonmarkFacet } from "../src/infinity/facets/Retire/RetireCarbonmarkFacet.sol";
import { RetireCMARKFacet } from "../src/infinity/facets/Bridges/CMARK/RetireCMARKFacet.sol";

import "../test/infinity/HelperContract.sol";

contract UpgradeInfinityForCMARK is Script, HelperContract {
function run() external returns (bytes memory) {
//read env variables and choose EOA for transaction signing
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address diamond = vm.envAddress("INFINITY_ADDRESS");
bytes memory updateFacetsCalldata;

OwnershipFacet ownerF = OwnershipFacet(diamond);

vm.startBroadcast(deployerPrivateKey);

//deploy updated facets and init contract
RetireCarbonmarkFacet retireCarbonmarkF = new RetireCarbonmarkFacet();
RetireCMARKFacet retireCMARKF = new RetireCMARKFacet();

// FacetCut array which contains the three standard facets to be added
IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](2);

// Klima Infinity specific facets
cut[0] = (
IDiamondCut.FacetCut({
facetAddress: address(retireCarbonmarkF),
action: IDiamondCut.FacetCutAction.Replace,
functionSelectors: generateSelectors("RetireCarbonmarkFacet")
})
);

cut[1] = (
IDiamondCut.FacetCut({
facetAddress: address(retireCMARKF),
action: IDiamondCut.FacetCutAction.Add,
functionSelectors: generateSelectors("RetireCMARKFacet")
})
);

vm.stopBroadcast();

// get calldata for the upgrade without init for interal library function view
updateFacetsCalldata = abi.encodeWithSelector(
IDiamondCut.diamondCut.selector,
cut,
address(0),
""
);

console2.log("New retireCarbonmarkF address");
console2.logAddress(address(retireCarbonmarkF));

console2.log("New retireCMARKF address");
console2.logAddress(address(retireCMARKF));

console2.log("Updated Retire Carbonmark Facet Calldata");
console2.logBytes(updateFacetsCalldata);

return updateFacetsCalldata;

}
}
5 changes: 5 additions & 0 deletions src/infinity/C.sol
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ library C {
address constant TOUCAN_REGISTRY = 0x263fA1c180889b3a3f46330F32a4a23287E99FC9;
address constant C3_PROJECT_FACTORY = 0xa4c951B30952f5E2feFC8a92F4d3c7551925A63B;
address constant ICR_PROJECT_REGISTRY = 0x9f87988FF45E9b58ae30fA1685088460125a7d8A;
address constant CMARK_CREDIT_FACTORY = 0xEeE3abDD638E219261e061c06C0798Fd5C05B5D3;

address constant COOREST_POOL = 0x363ae9B7Dbf55c0956A74C3be4ed0996d277A8BE;
address constant COOREST_POCC_TOKEN = 0x51cF819352FC536aD8A84214922615C160BB497D;
Expand Down Expand Up @@ -166,6 +167,10 @@ library C {
return C3_PROJECT_FACTORY;
}

function cmarkCreditFactory() internal pure returns (address) {
return CMARK_CREDIT_FACTORY;
}

function carbonmark() internal pure returns (address) {
return CARBONMARK;
}
Expand Down
62 changes: 62 additions & 0 deletions src/infinity/facets/Bridges/CMARK/RetireCMARKFacet.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

import "../../../libraries/Bridges/LibCMARKCarbon.sol";
import "../../../libraries/LibRetire.sol";
import "../../../libraries/TokenSwap/LibSwap.sol";
import "../../../ReentrancyGuard.sol";

contract RetireCMARKFacet is ReentrancyGuard {
event CarbonRetired(
LibRetire.CarbonBridge carbonBridge,
address indexed retiringAddress,
string retiringEntityString,
address indexed beneficiaryAddress,
string beneficiaryString,
string retirementMessage,
address indexed carbonPool,
address carbonToken,
uint retiredAmount
);

/**
* @notice This contract assumes that the token being provided is a raw CMARK credit token.
* @notice The transactions will revert otherwise.
*/

/**
* @notice Retires CMARK credits directly
* @param carbonToken Pool token to redeem
* @param amount Amounts of underlying tokens to redeem
* @param details Encoded struct of retirement details needed for the retirement
* @param fromMode From Mode for transfering tokens
* @return retirementIndex The latest retirement index for the beneficiary address
*/
function cmarkRetireExactCarbon(
address carbonToken,
uint amount,
LibRetire.RetireDetails memory details,
LibTransfer.From fromMode
) external nonReentrant returns (uint retirementIndex) {
// Currently this is a simple wrapper for direct calls on specific CMARK tokens
// No fee is charged

LibTransfer.receiveToken(IERC20(carbonToken), amount, msg.sender, fromMode);

if (details.retiringAddress == address(0)) details.retiringAddress = msg.sender;

bytes memory tempEmptyStringTest = bytes(details.retiringEntityString);
if (tempEmptyStringTest.length == 0) {
details.retiringEntityString = "KlimaDAO Retirement Aggregator";
}

// Retire the carbon
LibCMARKCarbon.retireCMARK(
carbonToken,
amount,
details
);

return LibRetire.getTotalRetirements(details.beneficiaryAddress);
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just curious, how does this value actually get incremented? Is it a side effect of retireCMARK() -> saveRetirementDetails() ?

}
}
10 changes: 10 additions & 0 deletions src/infinity/interfaces/ICMARKCredit.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
interface ICMARKCreditToken {
function retire(uint256 amount, address beneficiary, string calldata beneficiaryName, string calldata message, string calldata consumptionCountryCode) external;
function retireFrom(uint256 amount, address beneficiary, string calldata beneficiaryName, string calldata message, string calldata consumptionCountryCode, address account) external;
}

interface ICMARKCreditTokenFactory {
function creditAddressToId(address) external view returns (string memory);
function creditIdToAddress(string calldata) external view returns (address);
function issueCredits(string calldata, uint256, address) external;
}
18 changes: 18 additions & 0 deletions src/infinity/interfaces/ICarbonmark.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,24 @@
pragma solidity ^0.8.16;

interface ICarbonmark {

error CarbonmarkMarketplace_ListingDoesNotExist();
error CarbonmarkMarketplace_ListingAlreadyExists();
error CarbonmarkMarketplace_ListingNotOwner();
error CarbonmarkMarketplace_ListingExpired();
error CarbonmarkMarketplace_ListingTokenNotSupported(address token);
error CarbonmarkMarketplace_ListingTokenBalanceTooLow(address token, uint256 currentBalance, uint256 listingAmount);
error CarbonmarkMarketplace_ListingTokenAllowanceTooLow(
address token, uint256 currentAllowance, uint256 listingAmount
);
error CarbonmarkMarketplace_ListingTokenNotApprovedForAll(address token, bool approval);
error CarbonmarkMarketplace_ListingPurchaseInExcessOfAvailable();
error CarbonmarkMarketplace_ListingFillTotalCostGreaterThanMax();
error CarbonmarkMarketplace_ListingPurchaseBelowMinimumFill();
error CarbonmarkMarketplace_ListingFillDetailsMismatch();
error CarbonmarkMarketplace_ListingAmountLessThanMinFillAmount(uint256 amount, uint256 minFillAmount);
error CarbonmarkMarketplace_ListingAmountZero();

/**
* @notice Struct containing all of the detail information needed to fill a listing
* @param account Ethereum address of the account who owns the listing
Expand Down
74 changes: 74 additions & 0 deletions src/infinity/libraries/Bridges/LibCMARKCarbon.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

import "../LibRetire.sol";
import "../Token/LibTransfer.sol";
import "../../interfaces/ICMARKCredit.sol";
import "../../C.sol";

import "lib/forge-std/src/console.sol";

/**
* @author MarcusAurelius
* @title LibCMARKCarbon
*/

library LibCMARKCarbon {
event CarbonRetired(
Comment thread
0xAurelius marked this conversation as resolved.
LibRetire.CarbonBridge carbonBridge,
address indexed retiringAddress,
string retiringEntityString,
address indexed beneficiaryAddress,
string beneficiaryString,
string retirementMessage,
address indexed carbonPool,
address carbonToken,
uint retiredAmount
);

/**
* @notice Retire a CMARK project token
Comment thread
0xAurelius marked this conversation as resolved.
* @param projectToken Project token being retired
* @param amount Amount of tokens to retire
* @param details Encoded struct of retirement details needed for the retirement
*/
function retireCMARK(
address projectToken,
uint amount,
LibRetire.RetireDetails memory details
) internal {
ICMARKCreditToken(projectToken).retire(
amount,
details.beneficiaryAddress,
details.beneficiaryString,
details.retirementMessage,
details.consumptionCountryCode
);

LibRetire.saveRetirementDetails(
address(0),
projectToken,
amount,
details.beneficiaryAddress,
details.beneficiaryString,
details.retirementMessage
);

emit CarbonRetired(
LibRetire.CarbonBridge.CMARK,
details.retiringAddress,
details.retiringEntityString,
details.beneficiaryAddress,
details.beneficiaryString,
details.retirementMessage,
address(0),
projectToken,
amount
);
}

function isValid(address token) internal returns (bool) {
bytes memory tempEmptyStringTest = bytes(ICMARKCreditTokenFactory(C.cmarkCreditFactory()).creditAddressToId(token));
return tempEmptyStringTest.length > 0;
}
}
11 changes: 10 additions & 1 deletion src/infinity/libraries/LibRetire.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {LibMeta} from "./LibMeta.sol";
import "./Bridges/LibToucanCarbon.sol";
import "./Bridges/LibMossCarbon.sol";
import "./Bridges/LibC3Carbon.sol";
import "./Bridges/LibCMARKCarbon.sol";
import "./Bridges/LibICRCarbon.sol";
import "./Bridges/LibCoorestCarbon.sol";
import "./Token/LibTransfer.sol";
Expand All @@ -28,7 +29,8 @@ library LibRetire {
MOSS,
C3,
ICR,
COOREST
COOREST,
CMARK
Comment thread
0xAurelius marked this conversation as resolved.
}

struct RetireDetails {
Expand Down Expand Up @@ -285,6 +287,13 @@ library LibRetire {
amount,
details
);
} else if (LibCMARKCarbon.isValid(creditToken)) {
// Retire the carbon
LibCMARKCarbon.retireCMARK(
creditToken,
amount,
details
);
}
}

Expand Down
Loading