以下情境为教学假设,人物与数字不代表经核实的真实案例。
交割日之前,买方会要求卖方在一份文件里对很多事情做出陈述:合同是真的、IP 是干净的、账是完整的、税是报过的、没有未披露的诉讼、客户数据是合规的。这些陈述就是 reps & warranties。它们不是质量保证书,而是风险分配工具:如果陈述不实,买方可以索赔;赔偿上限、篮子和托管决定这笔索赔最后由谁承担、承担多少、什么时候承担。
这一节把保护条款拆成四个可计算的量:赔偿上限、篮子、托管比例和托管期限。用一笔 300,000 美元的交易做例子,按 15% 托管 45,000 美元、12 个月、8% 教学机会成本,算出托管占用成本和不同索赔下的卖方净得。所有比例、期限、折现率和索赔金额都是教学假设,不构成法律或税务意见。
陈述保证在买什么
reps & warranties 覆盖的范围通常比独立开发者想象得宽。除了财务和合同,还包括知识产权归属、开源许可证、员工与外包关系、税务申报、隐私与数据安全、诉讼与仲裁、关联交易、客户集中度和未披露负债。买方不是要求卖方保证「生意一定成功」,而是要求卖方保证「交给你的信息没有隐藏的重大错误」。
| 保护条款 | 它做什么 | 教学区间 | 对卖方的影响 |
|---|---|---|---|
| 赔偿上限 | 限制卖方因陈述不实承担的最高金额 | 交易价的 10%–20% | 上限越低,卖方尾部风险越小 |
| 篮子 | 决定多小的索赔不赔、超过后怎么赔 | 交易价的 0.5%–2% | deductible 吸收小额索赔,tipping 越过阈值全赔 |
| 托管 | 从交割款里留一笔钱待索赔 | 交易价的 10%–20%,12–24 个月 | 占用现金,产生机会成本 |
| 排他救济 | 买方只能从托管拿钱,不能另诉卖方 | 常见于小额交易 | 卖方损失以托管为上限 |
这张表里,赔偿上限和托管最容易混淆。上限是「最多赔多少」,托管是「先从哪笔钱里赔」。上限可以高于、等于或低于托管;如果托管高于上限,超出的部分没有对应的赔偿风险,只是被锁住的现金。篮子则是「多小的索赔值得赔」:deductible 像保险免赔额,买方先吸收第一段;tipping 像门槛,越过之后整笔索赔都能赔。
陈述保证不是越少越好。买方需要这些陈述来确认自己买的是什么;如果卖方拒绝给某项陈述,买方要么自己承担风险并压低价格,要么要求专项托管。对独立开发者,最容易被要求陈述的三项是 IP 归属、开源许可证和客户合同的可转让性;这三项恰好也是尽调里最容易查出问题的部分。
赔偿上限与篮子
用一笔 300,000 美元的交易做例子。教学假设:赔偿上限是交易价的 10%,即 30,000 美元;篮子 1%,即 3,000 美元,按 deductible 计算;托管 15%,即 45,000 美元。买方提出一笔索赔,金额从 2,000 到 80,000 美元不等,卖方的赔偿如下。
| 索赔金额 | 超过篮子部分 | 赔偿上限 10% | 卖方实际赔偿 | 说明 |
|---|---|---|---|---|
| 2,000 | 0 | 30,000 | 0 | 低于篮子,买方自担 |
| 20,000 | 17,000 | 30,000 | 17,000 | 篮子吸收 3,000 |
| 50,000 | 47,000 | 30,000 | 30,000 | 触顶,买方自担 20,000 |
| 80,000 | 77,000 | 30,000 | 30,000 | 触顶,买方自担 50,000 |
如果篮子改成 tipping,索赔 20,000 美元时买方可以拿到全额 20,000 美元,而不是 17,000 美元;索赔低于 3,000 美元时仍然拿不到。tipping 对买方更有利,deductible 对卖方更有利。篮子的大小和类型会直接改变小额索赔的结果,所以在谈判时不能只写「有篮子」,要写清是 deductible 还是 tipping。
赔偿上限按交易价的比例计算,意味着上限随着报价一起放大。300,000 美元的交易,10% 是 30,000 美元,20% 是 60,000 美元,每 5 个百分点是 15,000 美元。LedgerLite 的 768,768 美元报价,10% 是 76,877 美元;Tidecast 的 248,708 美元报价,10% 是 24,871 美元。同样的 10% 上限,在三个案例里对应的绝对金额差很多,谈判时要同时看比例和金额。
上限不是唯一的尾部风险。如果合同允许买方在托管之外继续追索,卖方的最大损失仍然是上限;如果合同没有上限,或者上限只适用于部分陈述,卖方的风险会超出托管。独立开发者最容易忽略的是「基本陈述」:IP 归属、股权结构和税务通常不适用一般赔偿上限,或者适用更高的专项上限。签字前要确认哪些陈述在上限之内,哪些在上限之外。
托管:比例、期限与占用成本
托管是从交割款里留出的一笔钱,放在第三方账户,等索赔期结束后释放。教学区间是交易价的 10%–20%,期限 12–24 个月。300,000 美元的交易,15% 托管是 45,000 美元;如果卖方把这笔钱留在自己手里,按 8% 年化教学机会成本,12 个月的占用成本是 45,000 × 8% = 3,600 美元。公式可以写成:托管金额 × 年化机会成本 × 持有月数 ÷ 12。
| 托管比例 | 托管金额 | 赔偿上限 10% | 超额托管 | 12 个月机会成本 |
|---|---|---|---|---|
| 10% | 30,000 | 30,000 | 0 | 2,400 |
| 15% | 45,000 | 30,000 | 15,000 | 3,600 |
| 20% | 60,000 | 30,000 | 30,000 | 4,800 |
这张表暴露了一个常见错配:托管 15% 是 45,000 美元,赔偿上限 10% 只有 30,000 美元,多出来的 15,000 美元没有对应的赔偿风险,只是被锁住。按 8% 机会成本,这 15,000 美元一年的成本是 1,200 美元;如果托管 20%,超额 30,000 美元,一年成本 2,400 美元。托管比例高于赔偿上限时,超出部分是纯成本,除非合同还覆盖了上限之外的专项索赔。
释放条件通常分三种:没有索赔,到期全额释放;有索赔但已解决,扣除赔偿后释放余额;有未决索赔,争议部分继续冻结,其余释放。常见的安排是 12 个月释放一部分、24 个月释放剩余部分,或者 12 个月一次性释放。释放需要托管代理、双方指令和索赔清单;如果买方在到期前提出索赔,释放会延后到争议解决。卖方要在合同里写清释放时间、索赔通知期限和争议处理方式,否则托管可能变成长期占款。
托管不是越少越好。买方要求托管,是因为部分陈述的风险在交割后才会显现;如果卖方把托管压到零,买方可能要求更高的赔偿上限、更长的索赔期或更低的价格。托管的作用是把「不确定的赔偿」变成「确定的占款」,卖方用现金占用换尾部风险的封顶。关键不是托管比例本身,而是托管、上限和索赔期三者是否匹配。
把赔偿上限算进净得
把索赔和占用成本放进同一张表,卖方净得就清楚了。假设交易价 300,000 美元,托管 15% 即 45,000 美元,12 个月机会成本 3,600 美元,赔偿上限 10% 即 30,000 美元,篮子 1% 即 3,000 美元,按 deductible 计算,托管不是排他救济。
| 情景 | 索赔 | 卖方赔偿 | 机会成本 | 卖方净得 |
|---|---|---|---|---|
| 无索赔 | 0 | 0 | 3,600 | 296,400 |
| 小额索赔 | 20,000 | 17,000 | 3,600 | 279,400 |
| 触顶索赔 | 50,000 | 30,000 | 3,600 | 266,400 |
| 大额索赔 | 80,000 | 30,000 | 3,600 | 266,400 |
如果赔偿上限提高到 20%,即 60,000 美元,同样 15% 托管和 3,600 美元机会成本,索赔 50,000 美元时卖方赔偿 47,000 美元,净得 249,400 美元;索赔 80,000 美元时赔偿触顶 60,000 美元,其中 45,000 美元来自托管,15,000 美元由卖方另行支付,净得 236,400 美元。上限从 10% 提高到 20%,在 80,000 美元索赔下多赔 30,000 美元,正好是交易价的 10%。
托管是否排他,也会改变卖方的尾部损失。假设赔偿上限 30%,即 90,000 美元,托管 15% 即 45,000 美元,索赔 80,000 美元,篮子后赔偿 77,000 美元。如果托管是排他救济,卖方最多损失 45,000 美元托管,净得 251,400 美元;如果不是排他救济,卖方要补 32,000 美元,净得 219,400 美元。两者相差 32,000 美元,正好是赔偿超过托管的部分。独立开发者通常没有足够的现金应对交割后的追加赔偿,排他救济比高上限更重要。
这张表也说明「赔偿上限 = 交易价格的比例」不是抽象条款。300,000 美元的交易,10% 是 30,000 美元,20% 是 60,000 美元;每提高 5 个百分点,卖方多承担 15,000 美元的风险。如果卖方只能接受 10% 上限,就要把托管压到不超过 30,000 美元,或者把超额部分转为专项托管,避免为没有对应风险的钱付占用成本。
写成代码:reps-escrow.ts
下面的 reps-escrow.ts 把赔偿上限、篮子、托管和排他救济写成一个函数。输入包括交易价、托管比例与期限、机会成本、赔偿上限、篮子类型与比例、索赔金额,以及托管是否排他。输出包括托管金额、占用成本、篮子后的索赔、实际赔偿、托管支付、卖方自付、释放金额和卖方净得。
// file: src/capital/reps-escrow.ts
// tier: L1
// verify: node --test test/capital/reps-escrow.test.ts
import { type Cents } from "../core/money.ts";
import { type Bps, applyRate } from "../core/rate.ts";
import { type Result, fail, ok } from "../core/result.ts";
export type BasketKind = "tipping" | "deductible";
export type RepsInput = {
priceCents: Cents;
escrowBps: Bps;
escrowMonths: number;
annualDiscountRateBps: Bps;
indemnityCapBps: Bps;
basketKind: BasketKind;
basketBps: Bps;
claimCents: Cents;
escrowExclusive: boolean;
};
export type RepsOutcome = {
priceCents: Cents;
escrowCents: Cents;
escrowOpportunityCostCents: Cents;
indemnityCapCents: Cents;
basketCents: Cents;
claimCents: Cents;
claimAboveBasketCents: Cents;
indemnityCents: Cents;
escrowPaidCents: Cents;
sellerOutOfPocketCents: Cents;
escrowReleasedCents: Cents;
sellerPaidCents: Cents;
netProceedsCents: Cents;
capHit: boolean;
basketAbsorbedCents: Cents;
};
function validBps(value: Bps): boolean {
return Number.isInteger(value) && value >= 0 && value <= 10000;
}
/**
* A deductible basket means the buyer absorbs the first slice and recovers only
* the excess. A tipping basket means the buyer recovers the whole claim once
* the threshold is crossed. The escrow pays first; only a non-exclusive remedy
* reaches the seller's pocket beyond the escrow. Escrow size, term, cap and
* basket are teaching assumptions, not market standards.
*/
export function settleRepsClaim(input: RepsInput): Result<RepsOutcome> {
if (!Number.isInteger(input.priceCents) || input.priceCents <= 0) {
return fail("price must be a positive integer amount in cents");
}
if (!validBps(input.escrowBps)) {
return fail("escrow share must be between 0 and 10000 bps");
}
if (!Number.isInteger(input.escrowMonths) || input.escrowMonths <= 0) {
return fail("escrow term must be a positive integer month count");
}
if (!validBps(input.annualDiscountRateBps)) {
return fail("discount rate must be between 0 and 10000 bps");
}
if (!validBps(input.indemnityCapBps)) {
return fail("indemnity cap must be between 0 and 10000 bps");
}
if (
input.basketKind !== "tipping" &&
input.basketKind !== "deductible"
) {
return fail("basket kind must be tipping or deductible");
}
if (!validBps(input.basketBps)) {
return fail("basket must be between 0 and 10000 bps");
}
if (input.basketBps > input.indemnityCapBps) {
return fail("basket cannot exceed the indemnity cap");
}
if (!Number.isInteger(input.claimCents) || input.claimCents < 0) {
return fail("claim must be a non-negative integer amount in cents");
}
const escrowCents = applyRate(input.priceCents, input.escrowBps);
const indemnityCapCents = applyRate(
input.priceCents,
input.indemnityCapBps,
);
const basketCents = applyRate(input.priceCents, input.basketBps);
const escrowOpportunityCostCents = Math.round(
(escrowCents * input.annualDiscountRateBps * input.escrowMonths) / 120000,
);
const claimAboveBasketCents =
input.basketKind === "deductible"
? Math.max(0, input.claimCents - basketCents)
: input.claimCents > basketCents
? input.claimCents
: 0;
const basketAbsorbedCents =
input.basketKind === "deductible"
? Math.min(input.claimCents, basketCents)
: input.claimCents <= basketCents
? input.claimCents
: 0;
const indemnityCents = Math.min(
claimAboveBasketCents,
indemnityCapCents,
);
const escrowPaidCents = Math.min(indemnityCents, escrowCents);
const sellerOutOfPocketCents = input.escrowExclusive
? 0
: Math.max(0, indemnityCents - escrowCents);
const sellerPaidCents = escrowPaidCents + sellerOutOfPocketCents;
return ok({
priceCents: input.priceCents,
escrowCents,
escrowOpportunityCostCents,
indemnityCapCents,
basketCents,
claimCents: input.claimCents,
claimAboveBasketCents,
indemnityCents,
escrowPaidCents,
sellerOutOfPocketCents,
escrowReleasedCents: escrowCents - escrowPaidCents,
sellerPaidCents,
netProceedsCents: input.priceCents - sellerPaidCents -
escrowOpportunityCostCents,
capHit: claimAboveBasketCents > indemnityCapCents,
basketAbsorbedCents,
});
}
把 300,000 美元的例子代进去:托管 45,000 美元,机会成本 3,600 美元,赔偿上限 30,000 美元,篮子 3,000 美元。索赔 20,000 美元时,超过篮子 17,000 美元,托管支付 17,000 美元,释放 28,000 美元,卖方净得 279,400 美元。索赔 50,000 美元时,超过篮子 47,000 美元,触顶 30,000 美元,托管支付 30,000 美元,释放 15,000 美元,净得 266,400 美元。如果把托管改成 10%,同样索赔 50,000 美元,机会成本降到 2,400 美元,净得 267,600 美元;多出的 5% 托管没有增加赔偿覆盖,只多花了 1,200 美元。
代码里的 basketAbsorbedCents 和 capHit 是两个容易被忽略的输出。前者告诉你篮子吸收了多少索赔,后者告诉你赔偿有没有触顶。卖方谈判时最该关心的不是「上限是 10% 还是 15%」,而是「在这个上限下,最坏情况我要掏多少现金、托管够不够、释放条件是什么」。这三个问题都能从输出里读出来。
小结
- 陈述保证是风险分配工具,不是质量保证书;赔偿上限、篮子和托管决定卖方最后承担多少。
- 300,000 美元的交易,15% 托管是 45,000 美元,12 个月、8% 机会成本下占用成本 3,600 美元。
- 赔偿上限 10% 是 30,000 美元,篮子 1% 是 3,000 美元;索赔 20,000 美元时卖方赔 17,000 美元,索赔 50,000 美元时触顶赔 30,000 美元。
- 托管 15% 高于上限 10% 时,超额 15,000 美元没有对应赔偿风险,一年机会成本 1,200 美元,是纯成本。
- 上限从 10% 提高到 20%,80,000 美元索赔下卖方多赔 30,000 美元,正好是交易价的 10%。
- 托管排他时,80,000 美元索赔下卖方损失 45,000 美元托管;非排他时要补到 77,000 美元,相差 32,000 美元。
- 托管 10% 和 15% 在 50,000 美元索赔下净得相差 1,200 美元;多锁的钱没有增加覆盖,只增加成本。
- 所有比例、期限、机会成本和索赔金额都是教学假设;真实交易要按合同、尽调和双方风险分配来定。
阅读导航:上一节:7.2 现金、票据与 earn-out · 下一节:8.1 交割清单与资金流 。
常见错误与边界
- 把陈述保证当成质量保证。 它分配的是信息错误的风险,不是保证生意一定成功;买方关心的是有没有隐藏的重大错误。
- 只谈上限,不谈篮子。 上限决定最坏情况,篮子决定小额索赔赔不赔;两者要一起谈。
- 把 deductible 和 tipping 混为一谈。 deductible 吸收第一段,tipping 越过阈值全赔;同样的 1% 篮子,结果可能差很多。
- 托管高于上限。 多出的托管没有对应赔偿风险,只是占用现金;按 8% 机会成本,15,000 美元一年就是 1,200 美元。
- 忽略机会成本。 托管不是「反正会退回来」;12 个月、24 个月的时间价值要算进净得,尤其是现金紧张的卖方。
- 忘记释放条件。 没有索赔、已解决、未决争议的处理方式要写清;否则托管可能变成长期占款。
- 把排他救济当成默认。 排他救济把卖方损失限制在托管内,非排他救济可以追到上限;独立开发者通常更需要前者。
- 忽略基本陈述的例外。 IP 归属、股权结构和税务可能不适用一般上限;签字前要确认哪些陈述在上限之外。
- 用比例代替金额。 10% 上限在 300,000 美元交易是 30,000 美元,在 768,768 美元交易是 76,877 美元;比例相同,金额差很多。
- 把模型当法律意见。 模型只算赔偿和占用成本,不判断陈述是否真实、索赔是否成立;真实交易需要合同和尽调层面的核查。
本节的边界是「陈述保证、赔偿上限、篮子和托管」:只讨论保护条款的金额、比例、期限和净得,不展开陈述清单、索赔程序或税务处理。所有比例、期限、机会成本和索赔金额都是教学假设,不构成法律或税务意见。交割资金流见 8.1 交割清单与资金流 ,合同与知识转移见 9.1 雇佣与外包合同的承继 。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。