MCPcopy Create free account
hub / github.com/0xsequence/erc-1155 / encodeMetaApprovalData

Function encodeMetaApprovalData

tests/utils/helpers.ts:290–346  ·  view source on GitHub ↗
(a: ApprovalSignature, domainHash: string, gasReceipt?: GasReceipt | null, sigType?: string)

Source from the content-addressed store, hash-verified

288
289// Encode data that is passed to safeTransferFrom() for metaTransfers
290export async function encodeMetaApprovalData(a: ApprovalSignature, domainHash: string, gasReceipt?: GasReceipt | null, sigType?: string)
291{
292 const META_APPROVAL_TYPEHASH = "0xf5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524";
293
294 let sigData: string; // Data to sign
295 let txDataTypes: string[]; // Types of data to encode
296 let sig: string; // Signature
297
298 const approved_hex = a.approved ? '0x1' : '0x0'
299 const is_gas_Fee_hex = a.isGasFee ? '0x1' : '0x0'
300
301 // Struct Data type
302 const sigArgTypes = [
303 'bytes32', // META_TX_TYPEHASH
304 'uint256', // _owner: uint256(address)
305 'uint256', // _operator: uint256(address)
306 'uint256', // _approved: uint256(bool)
307 'uint256', // _isGasFee: uint256(bool)
308 'uint256', // nonce
309 ];
310
311 // Get signer
312 const signer = a.owner ? a.owner : await a.signerWallet.getAddress()
313
314 // Packed encoding of transfer signature message
315 sigData = ethers.utils.solidityPack(sigArgTypes, [
316 META_APPROVAL_TYPEHASH,
317 signer,
318 a.operator,
319 approved_hex,
320 is_gas_Fee_hex,
321 a.nonce,
322 ])
323
324 txDataTypes = ['bytes', 'bytes']; // (sig, (gasReceipt))
325
326 // When gas receipt is included
327 if (gasReceipt && gasReceipt !== null) {
328 const gasData = utils.defaultAbiCoder.encode([GasReceiptType], [gasReceipt])
329 sigData = ethers.utils.keccak256(ethers.utils.solidityPack(
330 ['bytes', 'bytes32'],
331 [sigData, ethers.utils.keccak256(gasData)] //Hash of _data
332 ))
333 sig = await ethSignTypedData(a.signerWallet, domainHash, sigData, a.nonce, sigType)
334 return utils.defaultAbiCoder.encode(txDataTypes, [sig, gasData])
335
336 } else {
337 const emptyTransferData = []
338 sigData = ethers.utils.keccak256(ethers.utils.solidityPack(
339 ['bytes', 'bytes32'],
340 [sigData, ethers.utils.keccak256(emptyTransferData)] //Hash of _data
341 ))
342 sig = await ethSignTypedData(a.signerWallet, domainHash, sigData, a.nonce, sigType)
343 return utils.defaultAbiCoder.encode(txDataTypes, [sig, emptyTransferData])
344 }
345
346}
347

Calls 1

ethSignTypedDataFunction · 0.85

Tested by

no test coverage detected