SDK
Withdraw
Withdraw assets from Aztec to Ethereum.
Use the WithdrawController to withdraw assets from Aztec to Ethereum.
You can find the interface of the WithdrawController here.
Controller Setup
AztecSdk.createWithdrawController(
userId: GrumpkinAddress,
userSigner: Signer,
value: AssetValue,
fee: AssetValue,
to: EthAddress)
: Promise<WithdrawController>
Inputs
| Arguments | Type | Description |
|---|---|---|
| userId | GrumpkinAddress | The Aztec account to make the withdrawal from. |
| userSigner | Signer | A signer for the provided userId. |
| value | AssetValue | The asset type and amount to withdraw. |
| fee | AssetValue | The asset type and amount to pay for the Aztec transaction fee. |
| to | EthAddress | The Ethereum address to send the funds on Ethereum. |
Returns
| Return Type | Description |
|---|---|
| WithdrawController | A user instance with apis bound to the user's account id. |
Fees
Fees for withdrawals are calculated using a similar method as for registrations, deposits and transfers, but using the getWithdrawalFees method.
getWithdrawalFees has a second optional options argument.
interface GetFeeOptions {
userId?: GrumpkinAddress;
userSpendingKeyRequired?: boolean;
excludePendingNotes?: boolean;
feeSignificantFigures?: number;
} & { recipient?: EthAddress; assetValue?: AssetValue }
recipient?: EthAddress is used to check if the recipient address is a contract wallet, for which the fees are higher.
The settlement time is inferred from the fee a user pays, it is not explicitly sent to the controller.
Executing a Withdrawal
A withdrawal setup and execution looks like this:
const tokenAssetId = sdk.getAssetIdByAddress(tokenAddress);
const tokenAssetValue = { assetId: tokenAssetId, value: tokenQuantity };
// optional fee options
// not relevant if using FeeController
const feeOptions = {
userId: aztecPublicKey,
userSpendingKeyRequired: true,
excludePendingNotes: true,
feeSignificantFigures: 2,
assetValue: tokenAssetValue,
recipient: ethAddress
}
const tokenWithdrawFee = (await sdk.getWithdrawFees(tokenAssetId, feeOptions))[settlementTime];
const tokenWithdrawController = sdk.createWithdrawController(
user,
signer,
tokenAssetValue,
tokenWithdrawFee,
recipientEthereumAddress
);
await tokenWithdrawController.createProof();
let txId = await tokenWithdrawController.send();
Once the transaction is sent, you just have to wait for the rollup to settle on Ethereum and the Rollup processor contract will send the funds.