{"record":{"id":"db81ae7577a40520","repo":"unionlabs/union","slug":"no-signer-passed","errorCode":null,"errorMessage":"no `signer` passed","messagePattern":"no `signer` passed","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"typescript-sdk/src/aptos/transfer.ts","lineNumber":205,"sourceCode":"      })\n\n      if (!pendingTransaction.isOk()) {\n        throw pendingTransaction.error\n      }\n      if (!pendingTransaction.value.hash.startsWith(\"0x\")) {\n        throw new Error(\"hash not found\")\n      }\n\n      return pendingTransaction.value.hash\n    },\n    error => new Error(`Transfer failed: ${error}`, { cause: error }),\n  )\n\nexport const aptosSameChainTransfer: (args: AptosTransferBaseParams) => ResultAsync<string, Error> =\n  ResultAsync.fromThrowable(\n    async parameters => {\n      if (!parameters.signer) {\n        throw new Error(\"no `signer` passed\")\n      }\n\n      if (parameters.authAccess === \"wallet\") {\n        const signer = parameters.signer as AptosBrowserWallet\n        const transaction = await signer.signAndSubmitTransaction({\n          payload: {\n            function: \"0x1::primary_fungible_store::transfer\",\n            type_arguments: [\"0x1::fungible_asset::Metadata\"],\n            arguments: [\n              //\n              parameters.denomAddress,\n              parameters.receiver,\n              parameters.amount.toString(),\n            ],\n          },\n        })\n\n        if (!transaction?.success) {","sourceCodeStart":187,"sourceCodeEnd":223,"githubUrl":"https://github.com/unionlabs/union/blob/031785bb6dc6b957c624e62bc64c184409c97d7b/typescript-sdk/src/aptos/transfer.ts#L187-L223","documentation":"First guard in aptosSameChainTransfer: the parameters object must include a truthy signer (an AptosAccount for key access or an AptosBrowserWallet for wallet access) before any same-chain fungible transfer can be built. Without a signer there is no one to authorize the 0x1::primary_fungible_store::transfer call.","triggerScenarios":"Invoking the SDK's same-chain Aptos transfer path with signer omitted, null, or undefined — e.g. building parameters from optional state (a wallet that never connected) and skipping a presence check.","commonSituations":"UI code where the wallet connection is async and transfer is attempted before it resolves; constructing params via spread of an optional object; refactoring that renamed account to signer and dropped it.","solutions":["Pass signer: aptosAccount (key mode) or signer: window.aptos wallet object (wallet mode) in the transfer parameters","Gate the transfer call on wallet connection / account availability in the UI before invoking","If migrating from older SDK versions, check whether the field was renamed from account to signer"],"exampleFix":"// before\nconst hash = await transferAsset({ ...params, /* signer missing */ })\n\n// after\nconst hash = await transferAsset({\n  ...params,\n  signer: aptosAccount, // or the connected browser wallet\n})","handlingStrategy":"validation","validationCode":"if (!params.signer) {\n  throw new Error(\"Connect an Aptos account or wallet before transferring\")\n}\nconst hash = await aptosSameChainTransfer(params).toPromise()","typeGuard":"const hasAptosSigner = (p: AptosTransferBaseParams): p is AptosTransferBaseParams & { signer: AptosAccount | AptosBrowserWallet } =>\n  Boolean(p.signer)","tryCatchPattern":"try {\n  hash = await aptosSameChainTransfer(params).toPromise()\n} catch (error) {\n  if ((error as Error).message === \"no `signer` passed\") {\n    // prompt for wallet connection / load account, then retry\n  }\n  throw error\n}","preventionTips":["Gate transfer buttons on account/wallet availability in the UI","Make signer a required field in your own parameter types","After SDK upgrades, diff parameter field names (account vs signer)"],"tags":["aptos","validation","signer","typescript-sdk"],"backgroundTag":null,"analyzedSha":"031785bb6dc6b957c624e62bc64c184409c97d7b","analyzedAt":"2026-08-16T06:24:09.996Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}