-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path7702-convert-evm.ts
More file actions
72 lines (65 loc) · 2.96 KB
/
7702-convert-evm.ts
File metadata and controls
72 lines (65 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { config } from 'dotenv';
import {
CHAIN_ID,
EIP7702Authorization,
IUniversalAccountConfig,
SUPPORTED_TOKEN_TYPE,
UNIVERSAL_ACCOUNT_VERSION,
UniversalAccount,
} from '@particle-network/universal-account-sdk';
import { getBytes, hashAuthorization, Wallet } from 'ethers';
config();
(async () => {
try {
const wallet = new Wallet(process.env.PRIVATE_KEY || '');
const universalAccountConfig: IUniversalAccountConfig = {
projectId: process.env.PROJECT_ID || '',
projectClientKey: process.env.PROJECT_CLIENT_KEY || '',
projectAppUuid: process.env.PROJECT_APP_UUID || '',
smartAccountOptions: {
useEIP7702: true,
name: 'UNIVERSAL',
version: process.env.UNIVERSAL_ACCOUNT_VERSION || UNIVERSAL_ACCOUNT_VERSION,
ownerAddress: wallet.address,
// Optional: set solanaAccountIndex to control which Solana address is derived
// SOLANA_ACCOUNT_INDEX.CLASSIC = use classic Solana smart account address
// SOLANA_ACCOUNT_INDEX.EIP7702 = use EIP-7702 derived Solana address
// solanaAccountIndex: SOLANA_ACCOUNT_INDEX.CLASSIC,
},
};
const universalAccount = new UniversalAccount(universalAccountConfig);
const transaction = await universalAccount.createConvertTransaction({
expectToken: { type: SUPPORTED_TOKEN_TYPE.USDT, amount: '0.0001' },
chainId: CHAIN_ID.BSC_MAINNET,
});
// Handle 7702 Authorization
const authorizations: EIP7702Authorization[] = [];
const nonceMap = new Map<number, string>();
for (const userOp of transaction.userOps) {
if (!!userOp.eip7702Auth && !userOp.eip7702Delegated) {
let signatureSerialized = nonceMap.get(userOp.eip7702Auth.nonce);
if (!signatureSerialized) {
// const authorization = wallet.authorizeSync(userOp.eip7702Auth);
const dataHash = hashAuthorization(userOp.eip7702Auth);
const signature = wallet.signingKey.sign(dataHash);
signatureSerialized = signature.serialized;
nonceMap.set(userOp.eip7702Auth.nonce, signatureSerialized);
}
authorizations.push({
userOpHash: userOp.userOpHash,
signature: signatureSerialized,
});
}
}
const sendResult = await universalAccount.sendTransaction(
transaction,
wallet.signMessageSync(getBytes(transaction.rootHash)),
authorizations,
);
console.log('sendResult', sendResult);
console.log('sendResult.transactionId', sendResult.transactionId);
console.log('explorer url', `https://universalx.app/activity/details?id=${sendResult.transactionId}`);
} catch (error) {
console.error(error);
}
})();