Diff
checker
Texto
Texto
Imagens
Documentos
Excel
Pastas
Legal
Enterprise
Aplicativo para desktop
Preços
Fazer login
Baixar o Diffchecker Desktop
Comparar texto
Encontre a diferença entre dois arquivos de texto
Ferramentas
Histórico
Editor live
Recolher inalteradas
Sem quebra de linha
Layout
Dividido
Unificado
Nível de detalhe
Inteligente
Palavra
Caractere
Realce de sintaxe
Escolher sintaxe
Ignorar
Transformar texto
Ir à primeira mudança
Editar entrada
Diffchecker Desktop
A maneira mais segura de usar o Diffchecker. Obtenha o aplicativo Diffchecker Desktop: seus diffs nunca saem do seu computador!
Obter Desktop
diff
Criado
há 2 anos
O diff nunca expira
Limpar
Exportar
Compartilhar
Explicar
18 remoções
Linhas
Total
Removido
Caracteres
Total
Removido
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
146 linhas
Copiar tudo
25 adições
Linhas
Total
Adicionado
Caracteres
Total
Adicionado
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
153 linhas
Copiar tudo
import "dotenv/config"
import "dotenv/config"
import {
import {
createKernelAccount,
createKernelAccount,
createZeroDevPaymasterClient,
createZeroDevPaymasterClient,
createKernelAccountClient,
createKernelAccountClient,
Copiar
Copiado
Copiar
Copiado
addressToEmptyAccount,
} from "@zerodev/sdk"
} from "@zerodev/sdk"
import { signerToEcdsaValidator } from "@zerodev/ecdsa-validator"
import { signerToEcdsaValidator } from "@zerodev/ecdsa-validator"
import {
import {
signerToSessionKeyValidator,
signerToSessionKeyValidator,
ParamOperator,
ParamOperator,
serializeSessionKeyAccount,
serializeSessionKeyAccount,
deserializeSessionKeyAccount,
deserializeSessionKeyAccount,
oneAddress,
oneAddress,
} from "@zerodev/session-key"
} from "@zerodev/session-key"
import { UserOperation } from "permissionless"
import { UserOperation } from "permissionless"
import {
import {
http,
http,
Hex,
Hex,
createPublicClient,
createPublicClient,
parseAbi,
parseAbi,
encodeFunctionData,
encodeFunctionData,
Copiar
Copiado
Copiar
Copiado
Address,
} from "viem"
} from "viem"
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"
import { polygonMumbai } from "viem/chains"
import { polygonMumbai } from "viem/chains"
if (
if (
!process.env.BUNDLER_RPC ||
!process.env.BUNDLER_RPC ||
!process.env.PAYMASTER_RPC ||
!process.env.PAYMASTER_RPC ||
!process.env.PRIVATE_KEY
!process.env.PRIVATE_KEY
) {
) {
throw new Error("BUNDLER_RPC or PAYMASTER_RPC or PRIVATE_KEY is not set")
throw new Error("BUNDLER_RPC or PAYMASTER_RPC or PRIVATE_KEY is not set")
}
}
const publicClient = createPublicClient({
const publicClient = createPublicClient({
Copiar
Copiado
Copiar
Copiado
chain: polygonMumbai,
transport: http(process.env.BUNDLER_RPC),
transport: http(process.env.BUNDLER_RPC),
})
})
const signer = privateKeyToAccount(process.env.PRIVATE_KEY as Hex)
const signer = privateKeyToAccount(process.env.PRIVATE_KEY as Hex)
const contractAddress = "0x34bE7f35132E97915633BC1fc020364EA5134863"
const contractAddress = "0x34bE7f35132E97915633BC1fc020364EA5134863"
const contractABI = parseAbi([
const contractABI = parseAbi([
"function mint(address _to) public",
"function mint(address _to) public",
"function balanceOf(address owner) external view returns (uint256 balance)",
"function balanceOf(address owner) external view returns (uint256 balance)",
])
])
Copiar
Copiado
Copiar
Copiado
const sessionPrivateKey = generatePrivateKey()
const sessionKeySigner = privateKeyToAccount(sessionPrivateKey)
const createSessionKey = async () => {
Copiar
Copiado
Copiar
Copiado
const createSessionKey = async (sessionKeyAddress: Address) => {
const ecdsaValidator = await signerToEcdsaValidator(publicClient, {
const ecdsaValidator = await signerToEcdsaValidator(publicClient, {
signer,
signer,
})
})
const masterAccount = await createKernelAccount(publicClient, {
const masterAccount = await createKernelAccount(publicClient, {
plugins: {
plugins: {
sudo: ecdsaValidator,
sudo: ecdsaValidator,
},
},
})
})
console.log("Account address:", masterAccount.address)
console.log("Account address:", masterAccount.address)
Copiar
Copiado
Copiar
Copiado
// Create an "empty account" as the signer -- you only need the public
// key (address) to do this.
const emptySessionKeySigner = addressToEmptyAccount(sessionKeyAddress)
const sessionKeyValidator = await signerToSessionKeyValidator(publicClient, {
const sessionKeyValidator = await signerToSessionKeyValidator(publicClient, {
Copiar
Copiado
Copiar
Copiado
signer:
s
essionKeySigner,
signer:
emptyS
essionKeySigner,
validatorData: {
validatorData: {
paymaster: oneAddress,
paymaster: oneAddress,
permissions: [
permissions: [
{
{
target: contractAddress,
target: contractAddress,
// Maximum value that can be transferred. In this case we
// Maximum value that can be transferred. In this case we
// set it to zero so that no value transfer is possible.
// set it to zero so that no value transfer is possible.
valueLimit: BigInt(0),
valueLimit: BigInt(0),
// Contract abi
// Contract abi
abi: contractABI,
abi: contractABI,
// Function name
// Function name
functionName: "mint",
functionName: "mint",
// An array of conditions, each corresponding to an argument for
// An array of conditions, each corresponding to an argument for
// the function.
// the function.
args: [
args: [
{
{
// In this case, we are saying that the session key can only mint
// In this case, we are saying that the session key can only mint
// NFTs to the account itself
// NFTs to the account itself
operator: ParamOperator.EQUAL,
operator: ParamOperator.EQUAL,
value: masterAccount.address,
value: masterAccount.address,
},
},
],
],
},
},
],
],
},
},
})
})
const sessionKeyAccount = await createKernelAccount(publicClient, {
const sessionKeyAccount = await createKernelAccount(publicClient, {
plugins: {
plugins: {
sudo: ecdsaValidator,
sudo: ecdsaValidator,
regular: sessionKeyValidator,
regular: sessionKeyValidator,
},
},
})
})
Copiar
Copiado
Copiar
Copiado
// Include the private key when you serialize the session key
return await serializeSessionKeyAccount(sessionKeyAccount
)
return await serializeSessionKeyAccount(sessionKeyAccount
, sessionPrivateKey
)
}
}
Copiar
Copiado
Copiar
Copiado
const useSessionKey = async (serializedSessionKey: string
) => {
const useSessionKey = async (serializedSessionKey: string
, sessionKeySigner: any
) => {
const sessionKeyAccount = await deserializeSessionKeyAccount(publicClient, serializedSessionKey
)
const sessionKeyAccount = await deserializeSessionKeyAccount(publicClient, serializedSessionKey
, sessionKeySigner
)
const kernelClient = createKernelAccountClient({
const kernelClient = createKernelAccountClient({
account: sessionKeyAccount,
account: sessionKeyAccount,
chain: polygonMumbai,
chain: polygonMumbai,
transport: http(process.env.BUNDLER_RPC),
transport: http(process.env.BUNDLER_RPC),
sponsorUserOperation: async ({ userOperation }): Promise<UserOperation> => {
sponsorUserOperation: async ({ userOperation }): Promise<UserOperation> => {
const kernelPaymaster = createZeroDevPaymasterClient({
const kernelPaymaster = createZeroDevPaymasterClient({
chain: polygonMumbai,
chain: polygonMumbai,
transport: http(process.env.PAYMASTER_RPC),
transport: http(process.env.PAYMASTER_RPC),
})
})
return kernelPaymaster.sponsorUserOperation({
return kernelPaymaster.sponsorUserOperation({
userOperation,
userOperation,
})
})
},
},
})
})
const userOpHash = await kernelClient.sendUserOperation({
const userOpHash = await kernelClient.sendUserOperation({
userOperation: {
userOperation: {
callData: await sessionKeyAccount.encodeCallData({
callData: await sessionKeyAccount.encodeCallData({
to: contractAddress,
to: contractAddress,
value: BigInt(0),
value: BigInt(0),
data: encodeFunctionData({
data: encodeFunctionData({
abi: contractABI,
abi: contractABI,
functionName: "mint",
functionName: "mint",
args: [sessionKeyAccount.address],
args: [sessionKeyAccount.address],
}),
}),
}),
}),
},
},
})
})
console.log("userOp hash:", userOpHash)
console.log("userOp hash:", userOpHash)
}
}
const main = async () => {
const main = async () => {
Copiar
Copiado
Copiar
Copiado
// The
owner
creates a
session
key
, serializes it,
and
shares it with
the
agent
.
// The
agent
creates a
public-private
key
pair
and
sends
const
serializedSessionKey = await createSessionKey()
// the public key (address) to
the
owner
.
const
sessionPrivateKey = generatePrivateKey()
const sessionKeySigner = privateKeyToAccount(sessionPrivateKey)
Copiar
Copiado
Copiar
Copiado
// The agent
re
constructs
the
session key
using the serialized value
// The owner authorizes the public key by signing it and sending
await useSessionKey(serializedSessionKey
)
// back the signature
const serializedSessionKey = await createSessionKey(sessionKeySigner.address)
// The agent
constructs
a full
session key
await useSessionKey(serializedSessionKey
, sessionKeySigner
)
}
}
main()
main()
Diferenças salvas
Texto original
Abrir arquivo
import "dotenv/config" import { createKernelAccount, createZeroDevPaymasterClient, createKernelAccountClient, } from "@zerodev/sdk" import { signerToEcdsaValidator } from "@zerodev/ecdsa-validator" import { signerToSessionKeyValidator, ParamOperator, serializeSessionKeyAccount, deserializeSessionKeyAccount, oneAddress, } from "@zerodev/session-key" import { UserOperation } from "permissionless" import { http, Hex, createPublicClient, parseAbi, encodeFunctionData, } from "viem" import { generatePrivateKey, privateKeyToAccount } from "viem/accounts" import { polygonMumbai } from "viem/chains" if ( !process.env.BUNDLER_RPC || !process.env.PAYMASTER_RPC || !process.env.PRIVATE_KEY ) { throw new Error("BUNDLER_RPC or PAYMASTER_RPC or PRIVATE_KEY is not set") } const publicClient = createPublicClient({ chain: polygonMumbai, transport: http(process.env.BUNDLER_RPC), }) const signer = privateKeyToAccount(process.env.PRIVATE_KEY as Hex) const contractAddress = "0x34bE7f35132E97915633BC1fc020364EA5134863" const contractABI = parseAbi([ "function mint(address _to) public", "function balanceOf(address owner) external view returns (uint256 balance)", ]) const sessionPrivateKey = generatePrivateKey() const sessionKeySigner = privateKeyToAccount(sessionPrivateKey) const createSessionKey = async () => { const ecdsaValidator = await signerToEcdsaValidator(publicClient, { signer, }) const masterAccount = await createKernelAccount(publicClient, { plugins: { sudo: ecdsaValidator, }, }) console.log("Account address:", masterAccount.address) const sessionKeyValidator = await signerToSessionKeyValidator(publicClient, { signer: sessionKeySigner, validatorData: { paymaster: oneAddress, permissions: [ { target: contractAddress, // Maximum value that can be transferred. In this case we // set it to zero so that no value transfer is possible. valueLimit: BigInt(0), // Contract abi abi: contractABI, // Function name functionName: "mint", // An array of conditions, each corresponding to an argument for // the function. args: [ { // In this case, we are saying that the session key can only mint // NFTs to the account itself operator: ParamOperator.EQUAL, value: masterAccount.address, }, ], }, ], }, }) const sessionKeyAccount = await createKernelAccount(publicClient, { plugins: { sudo: ecdsaValidator, regular: sessionKeyValidator, }, }) // Include the private key when you serialize the session key return await serializeSessionKeyAccount(sessionKeyAccount, sessionPrivateKey) } const useSessionKey = async (serializedSessionKey: string) => { const sessionKeyAccount = await deserializeSessionKeyAccount(publicClient, serializedSessionKey) const kernelClient = createKernelAccountClient({ account: sessionKeyAccount, chain: polygonMumbai, transport: http(process.env.BUNDLER_RPC), sponsorUserOperation: async ({ userOperation }): Promise<UserOperation> => { const kernelPaymaster = createZeroDevPaymasterClient({ chain: polygonMumbai, transport: http(process.env.PAYMASTER_RPC), }) return kernelPaymaster.sponsorUserOperation({ userOperation, }) }, }) const userOpHash = await kernelClient.sendUserOperation({ userOperation: { callData: await sessionKeyAccount.encodeCallData({ to: contractAddress, value: BigInt(0), data: encodeFunctionData({ abi: contractABI, functionName: "mint", args: [sessionKeyAccount.address], }), }), }, }) console.log("userOp hash:", userOpHash) } const main = async () => { // The owner creates a session key, serializes it, and shares it with the agent. const serializedSessionKey = await createSessionKey() // The agent reconstructs the session key using the serialized value await useSessionKey(serializedSessionKey) } main()
Texto alterado
Abrir arquivo
import "dotenv/config" import { createKernelAccount, createZeroDevPaymasterClient, createKernelAccountClient, addressToEmptyAccount, } from "@zerodev/sdk" import { signerToEcdsaValidator } from "@zerodev/ecdsa-validator" import { signerToSessionKeyValidator, ParamOperator, serializeSessionKeyAccount, deserializeSessionKeyAccount, oneAddress, } from "@zerodev/session-key" import { UserOperation } from "permissionless" import { http, Hex, createPublicClient, parseAbi, encodeFunctionData, Address, } from "viem" import { generatePrivateKey, privateKeyToAccount } from "viem/accounts" import { polygonMumbai } from "viem/chains" if ( !process.env.BUNDLER_RPC || !process.env.PAYMASTER_RPC || !process.env.PRIVATE_KEY ) { throw new Error("BUNDLER_RPC or PAYMASTER_RPC or PRIVATE_KEY is not set") } const publicClient = createPublicClient({ transport: http(process.env.BUNDLER_RPC), }) const signer = privateKeyToAccount(process.env.PRIVATE_KEY as Hex) const contractAddress = "0x34bE7f35132E97915633BC1fc020364EA5134863" const contractABI = parseAbi([ "function mint(address _to) public", "function balanceOf(address owner) external view returns (uint256 balance)", ]) const createSessionKey = async (sessionKeyAddress: Address) => { const ecdsaValidator = await signerToEcdsaValidator(publicClient, { signer, }) const masterAccount = await createKernelAccount(publicClient, { plugins: { sudo: ecdsaValidator, }, }) console.log("Account address:", masterAccount.address) // Create an "empty account" as the signer -- you only need the public // key (address) to do this. const emptySessionKeySigner = addressToEmptyAccount(sessionKeyAddress) const sessionKeyValidator = await signerToSessionKeyValidator(publicClient, { signer: emptySessionKeySigner, validatorData: { paymaster: oneAddress, permissions: [ { target: contractAddress, // Maximum value that can be transferred. In this case we // set it to zero so that no value transfer is possible. valueLimit: BigInt(0), // Contract abi abi: contractABI, // Function name functionName: "mint", // An array of conditions, each corresponding to an argument for // the function. args: [ { // In this case, we are saying that the session key can only mint // NFTs to the account itself operator: ParamOperator.EQUAL, value: masterAccount.address, }, ], }, ], }, }) const sessionKeyAccount = await createKernelAccount(publicClient, { plugins: { sudo: ecdsaValidator, regular: sessionKeyValidator, }, }) return await serializeSessionKeyAccount(sessionKeyAccount) } const useSessionKey = async (serializedSessionKey: string, sessionKeySigner: any) => { const sessionKeyAccount = await deserializeSessionKeyAccount(publicClient, serializedSessionKey, sessionKeySigner) const kernelClient = createKernelAccountClient({ account: sessionKeyAccount, chain: polygonMumbai, transport: http(process.env.BUNDLER_RPC), sponsorUserOperation: async ({ userOperation }): Promise<UserOperation> => { const kernelPaymaster = createZeroDevPaymasterClient({ chain: polygonMumbai, transport: http(process.env.PAYMASTER_RPC), }) return kernelPaymaster.sponsorUserOperation({ userOperation, }) }, }) const userOpHash = await kernelClient.sendUserOperation({ userOperation: { callData: await sessionKeyAccount.encodeCallData({ to: contractAddress, value: BigInt(0), data: encodeFunctionData({ abi: contractABI, functionName: "mint", args: [sessionKeyAccount.address], }), }), }, }) console.log("userOp hash:", userOpHash) } const main = async () => { // The agent creates a public-private key pair and sends // the public key (address) to the owner. const sessionPrivateKey = generatePrivateKey() const sessionKeySigner = privateKeyToAccount(sessionPrivateKey) // The owner authorizes the public key by signing it and sending // back the signature const serializedSessionKey = await createSessionKey(sessionKeySigner.address) // The agent constructs a full session key await useSessionKey(serializedSessionKey, sessionKeySigner) } main()
Encontrar Diferença