Taquito is a little special in that it requires a signer to forge an operation. In fact, we only need the signer to return the wallet address and the encoded public key. We'll initialize a Taquito RPC instance using our fake signer and a local forger (see below). After forging the operation, we can distribute it via the Dfns TypeScript SDK.
import { RpcClient } from '@taquito/rpc'
import { Signer, TezosToolkit } from '@taquito/taquito'
import { LocalForger } from '@taquito/local-forging'
import { Prefix, b58cencode, prefix } from '@taquito/utils'
const walletId = 'wa-6lbfv-9esgj-xxxxxxxxxxxxxxxx'
const wallet = await dfnsClient.wallets.getWallet({ walletId })
// Tezos requires a signer to forge a transaction. When forging, we only
// need 'publicKeyHash' (address) and 'publicKey' (encoded)
class TezosToolkitSigner implements Signer {
sign(): Promise<{
bytes: string
sig: string
prefixSig: string
sbytes: string
}> {
throw new Error('Method not implemented.')
}
async publicKey(): Promise<string> {
const prefix = wallet.signingKey.scheme === 'EdDSA' ? Prefix.EDPK : Prefix.SPPK
return b58cencode(wallet.signingKey.publicKey, prefix)
}
async publicKeyHash(): Promise<string> {
return wallet.address
}
secretKey(): Promise<string | undefined> {
throw new Error('Method not implemented.')
}
}
const client = new RpcClient('TEZOS_NODE_URL')
const Tezos = new TezosToolkit(client)
const forger = new LocalForger()
Tezos.setForgerProvider(forger)
Tezos.setSignerProvider(new TezosToolkitSigner())
const receiver = 'tz1XKKrD4NLRhBK4PFxQ4XvH2KXZ6J389N1Z'
// estimate fees
const estimate = await Tezos.estimate.transfer({
source: wallet.address,
to: receiver,
amount: 1,
})
const prepared = await Tezos.prepare.transaction({
source: wallet.address,
to: receiver,
amount: 1,
fee: estimate.suggestedFeeMutez,
gasLimit: estimate.gasLimit,
storageLimit: estimate.storageLimit,
})
const forgeable = await Tezos.prepare.toForge(prepared)
const forgedBytes = await forger.forge(forgeable)
const res = await dfnsClient.wallets.broadcastTransaction({
walletId,
body: {
kind: 'Transaction',
transaction: `0x${forgedBytes}`,
},
})