Retiring Credits Onchain
CarbonRegistry.com credits can be permissionlessly retired onchain without using CarbonRegistry.com APIs. Follow the guidelines below to complete the process.
CarbonRegistry.com enables the permissionless retirement of credits issued on its platform. Users can take full control of their credits by transferring them to their own wallets, portfolio managers, or onchain solutions, without losing the ability to retire the credits. As long as the required data is provided when the retirement function is executed, the process will generate an official retirement certificate on CarbonRegistry.com.
The Project Contract's Retire Function
To retire CarbonRegistry.com credits onchain, call the retire
function on the project contract that issued the credits:
function retire(
uint256 tokenId, // The ID of the exPost credits to be retired
uint256 amount, // The amount of credits to be retired, where 1 tCO2-e = 10^18 tokens
address beneficiary, // The wallet address that will receive the retirement NFT
string memory retireeName, // Name to be displayed on the official CarbonRegistry.com retirement certificate
string memory customUri, // Optional: Off-chain data URI for the retirement NFT
string memory comment, // Comment to be displayed on the CarbonRegistry.com retirement certificate
bytes memory data // Data required to generate the CarbonRegistry.com retirement certificate (see format below)
) external returns (uint256 nftTokenId) ;
Only the wallet address that holds the credits can call this function. When using this permissionless onchain method, it's essential that the transaction includes the required data
for the retirement certificate. Without this, the certificate may remain in an unfinalized state.
Note: The data
parameter is not stored onchain, but the retireeName
, customUri
, and comment
are saved as onchain metadata in the generated retirement NFT. Even though data
isn’t onchain, it plays a crucial role in creating the retirement certificate on CarbonRegistry.com.
Retire Function Data
Parameter
Data
ParameterThe data
parameter in the retire
function call should always be included, as it contains key information used to generate the retirement certificate. This parameter should include the beneficiary, reason, and comment for the retirement. If the retirement is part of a marketplace transaction or on behalf of an organization on CarbonRegistry.com, the organizationId
(the organization's account ID on CarbonRegistry.com) should also be provided.
Here’s an example of how to generate the data
field using Node.js:
const beneficiary = "ICR";
const reason = "Voluntary purposes"; // See options for this value below.
const comment = "Retiring credits for activities in 2023";
const organizationId = "e74b0f84-0023-4bfb-bdec-ba3d2b99197e";
const data = ethers.toUtf8Bytes(
JSON.stringify({
beneficiary: beneficiary,
reason: reason,
comment: comment,
organizationId: organizationId // Optional, depending on transaction context
})
);
This data
variable can then be passed into the transaction when calling the retire
function. Once the transaction is processed by a node, CarbonRegistry.com’s indexer will pick it up and generate the retirement certificate, which may take up to 15 minutes. If you need faster certificate generation, you can ping our indexer refresh endpoint.
Retirement Data Restrictions and Guidelines
When passing retirement certificate data to the retire
function, ensure that all fields are provided according to the following guidelines and restrictions:
beneficiary
: A short string representing the retiree's name, recommended to be under 100 characters.comment
: A string where the beneficiary can add custom text to be displayed on the retirement certificate, with a recommended limit of 500 characters.reason
: Must be one of the following predefined options:Compliance
Corsia
Voluntary purposes
Overall mitigations of global emissions
Corporate emission compensation
Other
Article 6.2
Testing
Unfinalized Retirements
If a retirement was processed without the necessary data (beneficiary
, reason
, and comment
), it will be marked as unfinalized
on CarbonRegistry.com. However, in many cases, you can still finalize
the retirement if you can prove ownership of the retirement certificate or the private key that signed the transaction.
To finalize
, you must create a signature proving that you either hold the retirement certificate NFT or control the wallet that signed the original retirement transaction. Below is an example using ethers.js
for frontend signing:
const beneficiary = "ICR";
const reason = "Voluntary purposes"; // Choose from the predefined options
const comment = "Retiring credits for activities in 2023";
const projectAddress = "0x77be59acfef85a1578a5996d06b48b6ee1bac29c";
const nftTokenId = "47"; // The retirement certificate NFT tokenId
const signatureMessage = `${beneficiary};;${comment};;${reason};;${projectAddress};;${nftTokenId}`;
const signer = await provider.getSigner(); // Ensure provider is initialized
const signature = await signer.signMessage(signatureMessage);
const carbonRegistryResponse = await axios.post("https://api.carbonregistry.com/retirements/finalize", {
signer: "0xd00749D7eb0D333D8997B0d5Aec0fa86cf026c76", // Signer of the signature
signature,
signedData: {
comment,
reason,
beneficiary,
projectAddress,
tokenId: nftTokenId
}
}, {
headers: {
Authorization: `Bearer %Carbon_Registry_Access_token%`
}
});
This signature and signed data are then submitted to CarbonRegistry.com’s finalize endpoint, allowing the retirement to be completed.
Testing Data
When testing this functionality in production you should use the name of your organization as beneficiary
, the value Testing
for reason
.
Retirement Examples on CarbonRegistry.com
An example of a retirement transaction -> https://www.carbonregistry.com/transactions/4c95045f-dd40-4edf-b009-af1a5e8239d8
An example of an official CarbonRegistry.com retirement certificate -> https://www.carbonregistry.com/retirements/certificate/46-0x77be59acfef85a1578a5996d06b48b6ee1bac29c
Last updated