diff --git a/src/contractClients/acpContractClientV2.ts b/src/contractClients/acpContractClientV2.ts index d3bcdd4..28c6e12 100644 --- a/src/contractClients/acpContractClientV2.ts +++ b/src/contractClients/acpContractClientV2.ts @@ -30,6 +30,8 @@ import { import { AcpX402 } from "../acpX402"; import { base, baseSepolia } from "viem/chains"; import MEMO_MANAGER_ABI from "../abis/memoManagerAbi"; +import { Attribution } from "ox/erc8021"; +import { appendBuilderCodeData } from "../utils"; class AcpContractClientV2 extends BaseAcpContractClient { private RETRY_CONFIG = { @@ -47,7 +49,8 @@ class AcpContractClientV2 extends BaseAcpContractClient { private memoManagerAddress: Address, private accountManagerAddress: Address, agentWalletAddress: Address, - config: AcpContractConfig = baseAcpConfigV2 + config: AcpContractConfig = baseAcpConfigV2, + private builderCode?: string ) { super(agentWalletAddress, config); } @@ -56,7 +59,8 @@ class AcpContractClientV2 extends BaseAcpContractClient { walletPrivateKey: Address, sessionEntityKeyId: number, agentWalletAddress: Address, - config: AcpContractConfig = baseAcpConfigV2 + config: AcpContractConfig = baseAcpConfigV2, + builderCode?: string ) { const publicClients: Record< number, @@ -106,7 +110,8 @@ class AcpContractClientV2 extends BaseAcpContractClient { memoManagerAddress.result as Address, accountManagerAddress.result as Address, agentWalletAddress, - config + config, + builderCode ); acpContractClient.publicClients = publicClients; @@ -221,10 +226,16 @@ class AcpContractClientV2 extends BaseAcpContractClient { throw new AcpError("Session key client not initialized"); } + const dataSuffix = this.builderCode + ? Attribution.toDataSuffix({ codes: [this.builderCode] }) + : undefined; + const basePayload: any = { uo: operations.map((operation) => ({ target: operation.contractAddress, - data: operation.data, + data: dataSuffix + ? appendBuilderCodeData(operation.data, dataSuffix as Hex) + : operation.data, value: operation.value, })), }; diff --git a/src/utils.ts b/src/utils.ts index 1fe3f91..bb89e9c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,11 @@ -import { Address, decodeAbiParameters, encodeAbiParameters } from "viem"; +import { + Address, + concatHex, + decodeAbiParameters, + encodeAbiParameters, + Hex, + pad, +} from "viem"; import { arbitrum, arbitrumSepolia, @@ -118,3 +125,15 @@ export function encodeTransferEventMetadata( return result; } + +export function appendBuilderCodeData(data: Hex, suffix: Hex): Hex { + const opDataByteLength = (data.length - 2) / 2; + const suffixByteLength = (suffix.length - 2) / 2; + const opDataPaddedSize = Math.ceil(opDataByteLength / 32) * 32; + const suffixPaddedSize = Math.ceil(suffixByteLength / 32) * 32; + + const paddedData = pad(data, { size: opDataPaddedSize, dir: "right" }); + const paddedSuffix = pad(suffix, { size: suffixPaddedSize }); + + return concatHex([paddedData, paddedSuffix]); +}