Verify your transactions
Use this page while your wallet is open. Compare the prompt with the published addresses and with your loan contract. If a field does not match, do not sign.
A hardware wallet is a device that holds the key offline and shows the transaction on its own screen. Use that screen, not only the app or the computer.
TLDR: Parameters to check
Section titled “TLDR: Parameters to check”Compare these names and addresses with the open wallet prompt. You are on Ethereum mainnet (chain ID 1). If a field does not match, do not sign.
Depositing collateral
Section titled “Depositing collateral”| Asset | Address |
|---|---|
| WETH | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
| wstETH | 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 |
| WBTC | 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 |
| cbBTC | 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf |
Anvil Collateral Vault: 0x5d2725fdE4d7Aa3388DA4519ac0449Cc031d675f
approveon the token. The wallet labels the vaultspender. A spending-cap screen says Spender. A raw WETH decode saysguyandwad. Same address: the vault. The amount is this deposit, not an unlimited approval.depositToAccounton the vault._accountAddressis your own wallet._tokenAddressesis the token above._amountsis the deposit.depositAndApproveon the vault, when this deposit also sets the allowance._tokenAddressesand_amountsare the deposit._collateralizableContractAddressToApproveis the Letter of Credit address below.
Reserving collateral
Section titled “Reserving collateral”- Approving and depositing additional collateral: see above. The functions are
approve, thendepositToAccountordepositAndApprove. - Signing the allowance. This is not a transaction. The type name is
CollateralizableTokenAllowanceAdjustment.nameisCollateralVault.versionis1.chainIdis1.verifyingContractis the vault above.collateralizableAddressis the Letter of Credit below.tokenAddressis the collateral token above. createDynamicLOCon the Letter of Credit contract0x14db9a91933aD9433E1A0dB04D08e5D9EF7c4808. The vault is not a field on this call._beneficiary:0xF09eB5B1a72F5Ba260fBB5a998d3686eAbDeF3A7. Match this to your loan contract._collateralTokenAddress: the token you deposited._collateralTokenAmount: the reserved amount in the app._creditedTokenAddress: USDT0xdAC17F958D2ee523a2206206994597C13D831ec7for a USD loan, or EURC0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33cfor a CHF loan._creditedTokenAmount: principal plus full-term interest, plus the FX buffer on a CHF loan._expirationTimestamp: loan maturity plus 5 days.
Three contracts, three jobs
Section titled “Three contracts, three jobs”| Contract | Job | Address |
|---|---|---|
| Anvil Collateral Vault | Holds your coins. This is the spender on approve, and verifyingContract on the allowance signature. |
0x5d2725fdE4d7Aa3388DA4519ac0449Cc031d675f |
| Anvil Letter of Credit | The contract you authorize to reserve collateral, and the contract you call with createDynamicLOC. |
0x14db9a91933aD9433E1A0dB04D08e5D9EF7c4808 |
| Helva beneficiary contract (LOCBeneficiary) | Named as _beneficiary on the Letter of Credit. Not your vault. Not the lender’s wallet. |
0xF09eB5B1a72F5Ba260fBB5a998d3686eAbDeF3A7, and your loan contract |
How amounts appear
Section titled “How amounts appear”The app shows a human amount, such as 1.5 WETH. The wallet may show the same amount in the token’s smallest units.
| Asset | Decimals | Example |
|---|---|---|
| WETH, wstETH | 18 | 1 token = 1000000000000000000 |
| WBTC, cbBTC | 8 | 1 token = 100000000 |
| USDT, EURC | 6 | 1 token = 1000000 |
Confirm you are on Ethereum mainnet (chain ID 1).
The four wallet steps
Section titled “The four wallet steps”You may not see every step. Approve is skipped when the vault already has enough allowance for this deposit. Deposit is skipped when your vault already holds enough. Sign allowance is skipped when that allowance is already set, including when the deposit transaction set it. Create LoC is always required to reserve collateral for a new loan.
flowchart TD
A[1. Approve] --> Q1[Wallet fields match?]
Q1 -->|No| Stop[Do not sign. Contact Helva]
Q1 -->|Yes| B[2. Deposit]
B --> Q2[Wallet fields match?]
Q2 -->|No| Stop
Q2 -->|Yes| C[3. Sign allowance]
C --> Q3[Wallet fields match?]
Q3 -->|No| Stop
Q3 -->|Yes| D[4. Create LoC]
D --> Q4[Wallet fields match?]
Q4 -->|No| Stop
Q4 -->|Yes| Done[Letter of Credit created. Helva checks it on-chain before activating the loan]
1. Approve
Section titled “1. Approve”On-chain transaction. You pay gas.
Your wallet asks the token contract to approve a spender. The first time you deposit that token, or when an older approval is smaller than this deposit, you will see this step.
| Field | Should match | Where to cross-check |
|---|---|---|
| Token | The collateral asset you selected: WETH, wstETH, WBTC, or cbBTC | The asset in the app, and the token address in the TLDR above |
| Spender | Anvil Collateral Vault 0x5d2725fdE4d7Aa3388DA4519ac0449Cc031d675f |
TLDR above. Do not rely on the app alone |
| Amount | The amount you are about to deposit, not an unlimited approval | The deposit amount in the app. Convert smallest units with the table above |
Why it matters: approving an unknown spender can drain that token from your wallet.
2. Deposit
Section titled “2. Deposit”On-chain transaction. You pay gas.
The usual call is depositToAccount on the Anvil Collateral Vault. The coins are credited to your own address.
| Field | Should match | Where to cross-check |
|---|---|---|
| Contract you are calling | Anvil Collateral Vault 0x5d2725fdE4d7Aa3388DA4519ac0449Cc031d675f |
TLDR above |
| Token | The same asset you approved | App, and the TLDR above |
| Amount | The deposit amount | App |
| Account credited | Your own connected wallet address | The account shown in your wallet |
Why it matters: you are depositing to yourself. A different account means the coins would not be credited to you.
If the deposit also sets the allowance
Section titled “If the deposit also sets the allowance”When the amount you deposit covers the allowance the Letter of Credit needs, the app may send depositAndApprove instead. You will not see a separate Sign allowance step. There is no account field on this call. The wallet that sends the transaction is the account that gets the deposit, so that wallet must be yours.
| Field | Should match | Where to cross-check |
|---|---|---|
| Contract you are calling | Anvil Collateral Vault 0x5d2725fdE4d7Aa3388DA4519ac0449Cc031d675f |
TLDR above |
| Token and amount | The deposit you intend | App |
| Address being approved | Anvil Letter of Credit contract 0x14db9a91933aD9433E1A0dB04D08e5D9EF7c4808 |
TLDR above |
Why it matters: this call both deposits and lets the Letter of Credit contract reserve that deposit. The approved address must be the Letter of Credit contract, not an unknown contract.
3. Sign allowance
Section titled “3. Sign allowance”EIP-712 typed-data signature. Not a transaction. You pay no gas. Nothing is sent until the next step.
EIP-712 is a signature format that lets the wallet show named fields. The type name is CollateralizableTokenAllowanceAdjustment. This signature lets the Letter of Credit contract reserve collateral from your vault.
The message has no deadline. If the wallet shows an expiry on this signature, stop.
Domain
Section titled “Domain”| Field | Should match | Where to cross-check |
|---|---|---|
| name | CollateralVault |
This page |
| version | 1 |
This page |
| chainId | 1 (Ethereum mainnet) |
Your wallet’s network |
| verifyingContract | Anvil Collateral Vault 0x5d2725fdE4d7Aa3388DA4519ac0449Cc031d675f |
TLDR above |
Message
Section titled “Message”| Field | Should match | Where to cross-check |
|---|---|---|
| collateralizableAddress | Anvil Letter of Credit contract 0x14db9a91933aD9433E1A0dB04D08e5D9EF7c4808 |
TLDR above. This is not the vault, and not the beneficiary |
| tokenAddress | The collateral token you are reserving | App, and the TLDR above |
| allowanceAdjustment | The full collateral amount being reserved, in smallest units. This can be larger than the deposit you just made, because it covers the whole reservation | The reserved amount in the app |
| approverNonce | A number. You do not choose it. It must be present | No published value. Reject the prompt if this field is missing, or if any other message field is present |
Why it matters: this authorizes the Letter of Credit contract to reserve collateral from your vault. A wrong collateralizableAddress authorizes some other contract.
4. Create LoC
Section titled “4. Create LoC”On-chain transaction. You pay gas. The call is createDynamicLOC on the Anvil Letter of Credit contract.
The credited amount is principal plus full-term interest. For a CHF loan it also includes the FX buffer. USD loans use USDT and have no buffer. CHF loans use EURC.
Expiration is loan maturity plus 5 days, shown as a date or as a Unix timestamp (seconds since 1970).
| Field | Should match | Where to cross-check |
|---|---|---|
| Contract you are calling | Anvil Letter of Credit contract 0x14db9a91933aD9433E1A0dB04D08e5D9EF7c4808 |
TLDR above |
_beneficiary |
0xF09eB5B1a72F5Ba260fBB5a998d3686eAbDeF3A7 |
TLDR above, and your loan contract. Not the lender’s wallet. Not the vault |
_collateralTokenAddress |
The token you deposited | App, and the TLDR above |
_collateralTokenAmount |
The amount being reserved. It may be less than your full vault balance | The reserved amount in the app |
_creditedTokenAddress |
USDT 0xdAC17F958D2ee523a2206206994597C13D831ec7 for a USD loan, EURC 0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c for a CHF loan |
App, and the TLDR above |
_creditedTokenAmount |
Principal plus full-term interest, plus the FX buffer for a CHF loan, in the credit token’s smallest units | App, and The FX buffer |
_expirationTimestamp |
Loan maturity plus 5 days | The maturity date in your loan contract, plus 5 days |
| ETH value, if shown | Zero, or a fee that pays the price-oracle update | It is not your collateral. There is no second published figure for this fee. If you are unsure, contact Helva before you sign |
_oraclePriceUpdate |
Opaque bytes, or empty (0x) |
You do not need to decode this. Confirm the readable fields |
_collateralizableAllowanceSignature |
Opaque bytes, or empty (0x) if the allowance is already set |
You do not need to decode this. Empty is normal when you used depositAndApprove or an existing allowance |
_tag |
Empty (0x) |
This field does not authorize anything. If the readable fields are wrong, do not sign |
Why it matters: these fields decide who can redeem, how much collateral is reserved, and what credit amount that reservation covers.
If something does not match
Section titled “If something does not match”Do not sign. Contact Helva at support@helva.finance.
If a Letter of Credit was already created with the wrong beneficiary, Helva reads every Letter of Credit from the chain before activating a loan, so that loan will not be activated. The coins stay in your vault, reserved, until the Letter of Credit is cancelled.
Before expiry, only the named beneficiary can cancel it, or someone holding a cancel authorization from that beneficiary. Helva does not issue those authorizations, and Helva cannot cancel a Letter of Credit that names someone else. After it expires, you can cancel it yourself. That releases the reservation. This is why you check the beneficiary before you sign.
What Helva checks on its side
Section titled “What Helva checks on its side”Before a loan is activated, Helva reads the Letter of Credit from the chain, not from the app:
- The Letter of Credit exists.
- The beneficiary is Helva’s beneficiary contract.
- The credit asset and the credit amount match the loan, including the FX buffer on a CHF loan.
- Expiration is loan maturity plus 5 days.
- The creator is your registered wallet.
A mismatch means the loan is not activated.