Backend Integrations

Enable your users to deposit into syrupUSDC & syrupUSDT through your own app. Manage deposits programmatically. For wallets, exchanges, custody solutions etc.

Step-by-step

Deposit:

  1. Query the Maple API to retrieve the necessary contract addresses.

  2. Determine user authorization as a Syrup lender.

  3. Execute the Deposit (authorize and deposit, or deposit only).

Withdrawal:

  1. Retrieve Pool Position from the Maple API

  2. Calculate Shares to Redeem from the Pool contract

  3. Execute the Withdrawal on the Pool contract

SDK and GraphQL API

All necessary ABIs and addresses are available in the Maple SDK or via GitHub:

Within the SDK, both ABIs and network-specific addresses are accessible. The package can also be installed and used within applications.

To access the necessary data, use the GraphQL API:

https://api.maple.finance/v2/graphql

NOTE: In order to perform the integration in Sepolia, you'll need to contact us at [email protected] to receive Sepolia USDC/USDT tokens.

Deposit

1. Query the Maple API

Syrup's main contract, the SyrupRouter, is designed to allow authorized participants to securely access the yields available in the Maple ecosystem, abstracting all the complexity of the permissioning system. Each Syrup PoolV2 has an associated SyrupRouter.

Router addresses can also be accessed via the GraphQL API.

Example query

Code example using graphql-request

Listen for Router DepositData events (optional)

If you want to correlate deposits off-chain, subscribe to DepositData(address owner, uint256 amount, bytes32 depositData) on the syrupRouter address returned by GraphQL. Emitters include the caller’s address, raw deposit amount, and a bytes32 opaque identifier you pass in the deposit call.

Authorization signature verification (auditors)

Maple returns an authorization signature (v/r/s) used by authorizeAndDeposit. The router verifies a digest constructed from chainId, router address, owner, owner nonce, bitmap, and deadline. For internal reviews, auditors can reproduce the ecrecover and confirm the signer is a permissionAdmin in PoolPermissionManager.

It is important to note that the query uses the syrupRouter_not filter to return specifically Syrup pools.

Response Fields:

  • poolV2S.id: The Syrup Pool contract address.

  • poolV2S.syrupRouter.id: The SyrupRouter contract address.

These addresses can then be used to interact with the SyrupRouter contract.

2. Determine User Authorization

Before depositing, check if a user is already authorized by querying the Account entity. This is necessary to perform a deposit.

Example Query

NOTE: The account ID must be provided in lowercase.

Code example using graphql-request

If isSyrupLender = true, the user is already authorized in the Pool Permission Manager and can deposit into Syrup pools. Otherwise, the user must perform authorization before their initial deposit.

3. Retrieve Authorization Signature

Note: This step is only required if isSyrupLender = false was returned in the previous step. Otherwise, continue to the next step.

The Maple Protocol is geared towards institutions and has a permissioning system that requires allowlisting for executing most functions. For pool deposits, in general, lenders need to have their wallet allowlisted in Maple's Pool Permission Manager. Aiming to abstract and simplify the process, the SyrupRouter integrates directly with the Pool Permission Manager to allow for valid users to self-authorize and deposit in a single transaction assuming the user meets eligibility requirements.

To retrieve the authorization signature, contact us at [email protected].

Deposit data

  • Replace 0:<integrator-name> with your integrator identifier (e.g. 0:acme-protocol).

  • Maple will provide the final depositData for production.

  • Must be passed as bytes32 (32-byte hex).

4. Execute the Deposit

The first time an asset (e.g., USDC, USDT) is lent to Syrup, it may be necessary to allow the contract to interact with the asset. This is a common transaction on Ethereum.

Depositing into a pool requires a transaction. Once the transaction has been processed, SyrupRouter will accept the lending tokens and Pool LP (Liquidity Provider) tokens will be received.

Each pool contract inherits the ERC-4626 standard, also known as the Tokenized Vault Standard. This standard informs how the LP Tokens accrue value from borrower repayments of loans.

isSyrupLender = true - User is Already Authorized

The deposit or depositWithPermit method can be called directly on SyrupRouter.

NOTE: depositData is an optional field that does not need to be provided.

deposit()

Code example using Maple SDK for USDC or USDT.

Deposits into Syrup can also be made with gasless approval using permit. For more information, see https://eips.ethereum.org/EIPS/eip-2612.

NOTE: depositWithPermit is only available for Syrup USDC.

depositWithPermit()

Code example using Maple SDK

isSyrupLender = false - User Requires Authorization

  1. Retrieve a signature from the Maple API. Follow the instructions received from the team as mentioned in the step above.

  2. Use the retrieved signature with the authorizeAndDeposit or authorizeAndDepositWithPermit method on SyrupRouter.

authAndDeposit()

Code example using Maple SDK for USDC or USDT.

Deposits into Syrup can also be made with gasless approval using permit. For more information, see https://eips.ethereum.org/EIPS/eip-2612.

NOTE: authorizeAndDepositWithPermit is only available for Syrup USDC.

authAndDepositWithPermit()

Code example using Maple SDK

Withdraw

1. Retrieve Pool Position

Query the Maple API for the user's pool position data using the PoolV2Position field in the Account query:

Data model

Example query

Code example using graphql-request

2. Calculate Shares to Redeem

  • Withdrawal requests must be expressed in shares. Although the Maple API provides both availableShares and availableBalance, losses or impairments on the pool may affect the value of assets relative to shares.

  • To ensure accuracy, convert the desired asset amount to "exit shares" using the pool contract's conversion method.

  • These transactions leverage the ERC-4626 tokenized vault standard. For more information, see https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/.

Function signature

Code example using Maple SDK

3. Execute the Withdrawal

After calculating sharesToRedeem or fetching availableShares, call the requestRedeem method on the Pool contract to initiate the withdrawal.

Function signature

Code example using Maple SDK

4. Await Withdrawal Completion

Withdrawals are processed automatically by Maple. If there is sufficient liquidity in the pool, the withdrawal will be processed within a few minutes. Expected processing time is typically less than 2 days, but it can take up to 30 days depending on available liquidity. The current status of the withdrawal queue can be retrieved either directly from the WithdrawalManagerQueue contract or through the Maple GraphQL API:

Example query

Code example using graphql-request

Edge Cases

User Not Authorized

When attempting to use deposit or depositWithPermit and receiving the error SR:D:NOT_AUTHORIZED, it indicates that the account being used for deposit is not authorized in Syrup USD. To authorize the account, use authorizeAndDeposit or authorizeAndDepositWithPermit.

Problem:

Solution:

Insufficient Approval

When attempting to use deposit or depositWithPermit and receiving the error SR:D:TRANSFER_FROM_FAIL, it indicates that SyrupRouter could not transfer lending tokens. Ensure that the deposit amount matches the current approval for SyrupRouter. If it does not, increase the approval.

Problem:

Solution:

Invalid Signature

When attempting to use depositWithPermit and receiving the error ERC20:P:INVALID_SIGNATURE, it indicates that the recovered address from the signature does not match the address attempting to deposit. Ensure that the signature is signed by the account executing the transaction.

Expired Signature

When attempting to use depositWithPermit and receiving the error ERC20:P:EXPIRED, it indicates that the permit signature has expired. Ensure that the deadline set on the signature provides sufficient time to execute the transaction.

Insufficient Gas

When transactions fail due to insufficient gas, increase the gas limit in the transaction parameters. Syrup operations require more gas than simple token transfers due to the complex authorization and routing logic.

Problem:

Solution:

Pool Deposit Limit Exceeded

When encountering error P:DEPOSIT_GT_LIQ_CAP, it means the deposit amount exceeds the pool's deposit limit. Check the pool's current capacity before attempting large deposits.

Problem:

Solution:

To perform a deposit larger than the limit, contact the Syrup team via Telegram.

FAQ

What is the difference between Syrup and Maple?

Syrup is the protocol - the smart contracts that power onchain lending. Maple encompasses the entities that conduct institutional lending services using this infrastructure.

For developers: You'll be integrating with Syrup (the protocol), while Maple handles the institutional lending operations.

What is the authorize and deposit function with permit?

The authorizeAndDepositWithPermit function combines three operations into a single transaction:

  1. Authorization: Grants permission to deposit into Syrup pools (required for first-time users)

  2. Permit: Provides gasless token approval using EIP-2612 standard

  3. Deposit: Transfers tokens and mints pool shares

This function is ideal for first-time users who want to deposit USDC without requiring separate authorization and approval transactions. It saves gas and improves user experience by reducing the number of required transactions from three to one.

NOTE: Only available for USDC deposits, not USDT.

What are the permit signature parameters?

There are 5 parameters required for permit signature:

  • owner: The wallet address that owns the tokens and is granting permission (typically the user's address)

  • spender: The contract address receiving approval (the SyrupRouter contract address)

  • value: The token amount in smallest units (for USDC: 6 decimals, e.g., 1000000 = 1 USDC) that the spender is allowed to spend

  • nonce: A unique number preventing replay attacks (obtained by calling nonces(address) on the token contract). It increments with each permit signature used

  • deadline: Unix timestamp when the permit expires

Example

Do I need authorization for smart contract integration?

Yes, authorization is required for all Syrup deposits. Syrup protocol is built by Maple, which uses a permissioning system for institutional-grade security.

Authorization Process

  1. Contact us at [email protected] for eligibility verification

  2. Receive authorization signature parameters

  3. Use authorizeAndDeposit or authorizeAndDepositWithPermit for first deposit

  4. Subsequent deposits only need deposit or depositWithPermit

Once authorized, the permission persists across all Syrup pools and future deposits.

How do withdrawals work?

Withdrawals follow a queue-based system:

  1. Request: Call requestRedeem() to enter the withdrawal queue

  2. Queue Position: Withdrawals are processed first-in, first-out (FIFO)

  3. Processing: When pool liquidity is available, withdrawals are automatically processed

  4. Completion: Assets are sent directly to the wallet (no additional transaction required)

Timeline

  • Expected processing time is typically less than 2 days

  • During low liquidity periods, it may take up to 30 days

  • No penalties for withdrawing, but yield stops accumulating once withdrawal is requested

How long do withdrawals take?

syrupUSDC & syrupUSDT normally have instant liquidity, but in rare cases withdrawals can take around 24h with the maximum possible time being 30 days. You can see the available funds to withdraw in the Liquidity section of the Details page.

How can I get the APY data for syrupUSDC or syrupUSDT?

Querying the GraphQL API is the simplest way to get APY data for syrupUSDC or syrupUSDT into your app.

Example request

This returns

In the example above, the monthly base APY is 6.72% with the Drips rewards adding an extra 2.2% on top.

How can I get the price received on redemption for syrupUSDC or syrupUSDT?

syrupUSDC and syrupUSDT are redeemed at the smart contract exchange rate at the point of processing the withdrawal, incurring no slippage.

You can get the spot exchange rate for syrupUSDC to USDC or syrupUSDT to USDT by querying the GraphQL API.

Example request

This returns

The ratio of lendingBalance / totalShares is the spot exchange rate.

Last updated