更改托管地址
账户由托管地址拥有,该地址是 OP 主网上的一个以太坊地址。
用户可能出于安全考虑或需要转移整个账户所有权而更改此地址。
要求
更改托管地址
调用 Id Registry 合约的 transfer
函数。接收地址必须提供一个 EIP-712 签名以接受转移。
ts
import { ViemWalletEip712Signer } from '@farcaster/hub-web';
import { walletClient, account } from './clients.ts';
import { readNonce, getDeadline } from './helpers.ts';
const nonce = await readNonce();
const deadline = getDeadline();
const eip712Signer = new ViemWalletEip712Signer(walletClient);
const signature = await eip712signer.signTransfer({
fid: 1n,
to: account,
nonce,
deadline,
});
const { request: transferRequest } = await publicClient.simulateContract({
...IdContract,
functionName: 'transfer',
args: [account, deadline, signature], // to, deadline, signature
});
await walletClient.writeContract(transferRequest);
ts
import {
ID_REGISTRY_EIP_712_TYPES,
idRegistryABI,
ID_GATEWAY_ADDRESS,
} from '@farcaster/hub-web';
import { walletClient, account } from './clients.ts';
import { readNonce, getDeadline } from './helpers.ts';
const nonce = await readNonce();
const deadline = getDeadline();
const IdContract = {
abi: idRegistryABI,
address: ID_GATEWAY_ADDRESS,
chain: optimism,
};
const signature = await walletClient.signTypedData({
account,
...ID_REGISTRY_EIP_712_TYPES,
primaryType: 'Transfer',
message: {
fid: 1n,
to: account,
nonce,
deadline,
},
});
ts
import { ID_REGISTRY_ADDRESS, idRegistryABI } from '@farcaster/hub-web';
import { publicClient, account } from './clients.ts';
export const getDeadline = () => {
const now = Math.floor(Date.now() / 1000);
const oneHour = 60 * 60;
return now + oneHour;
};
export const readNonce = async () => {
return await publicClient.readContract({
address: ID_REGISTRY_ADDRESS,
abi: idRegistryABI,
functionName: 'nonces',
args: [account],
});
};
ts
import { createWalletClient, createPublicClient, custom, http } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import { optimism } from 'viem/chains';
export const publicClient = createPublicClient({
chain: optimism,
transport: http(),
});
export const walletClient = createWalletClient({
chain: optimism,
transport: custom(window.ethereum),
});
// JSON-RPC Account
export const [account] = await walletClient.getAddresses();
// Local Account
export const account = privateKeyToAccount('0x...');
WARNING
转移 FID 不会重置其恢复地址。如需转移 FID 并更新其恢复地址, 请调用 transferAndChangeRecovery
。
更多详情请参阅 Id Registry 部分。