output.set(value.Int());
// OR output.set(static_cast<CAmount::inner_type>(value.Int()));
Current code gets a local copy, overrides the local copy and local copy gets destroyed at the end of the function. Nothing is written back to the Cap'n Proto message.
<details>
Regression test:
diff --git a/src/ipc/test/ipc_test.capnp b/src/ipc/test/ipc_test.capnp
@@ -15,6 +15,7 @@ using Mining = import "../capnp/mining.capnp";
interface FooInterface $Proxy.wrap("FooImplementation") {
add [@0](/bitcoin-bitcoin/contributor/0/) (a :Int32, b :Int32) -> (result :Int32);
+ passAmounts [@6](/bitcoin-bitcoin/contributor/6/) (arg :List(Int64)) -> (result :List(Int64));
passOutPoint [@1](/bitcoin-bitcoin/contributor/1/) (arg :Data) -> (result :Data);
passUniValue [@2](/bitcoin-bitcoin/contributor/2/) (arg :Text) -> (result :Text);
passTransaction [@3](/bitcoin-bitcoin/contributor/3/) (arg :Data) -> (result :Data);
diff --git a/src/ipc/test/ipc_test.h b/src/ipc/test/ipc_test.h
@@ -15,6 +15,7 @@ class FooImplementation
{
public:
int add(int a, int b) { return a + b; }
+ std::vector<CAmount> passAmounts(std::vector<CAmount> v) { return v; }
COutPoint passOutPoint(COutPoint o) { return o; }
UniValue passUniValue(UniValue v) { return v; }
CTransactionRef passTransaction(CTransactionRef t) { return t; }
diff --git a/src/ipc/test/ipc_test.cpp b/src/ipc/test/ipc_test.cpp
@@ -84,6 +84,15 @@ void IpcPipeTest()
// Test: make sure arguments were sent and return value is received
BOOST_CHECK_EQUAL(foo->add(1, 2), 3);
+ // Test for CustomBuildField / CustomReadField overloads for
+ // CAmount in ipc/capnp/common-types.h. Each value is serialized
+ // once as the argument and once as the return value, so
+ // a build field that fails to write its value shows up as a zeroed result.
+ const std::vector<CAmount> amounts1{0_sats, 1_sats, COIN, MAX_MONEY, CAmount{-1}};
+ const std::vector<CAmount> amounts2{foo->passAmounts(amounts1)};
+ BOOST_CHECK_EQUAL_COLLECTIONS(amounts1.begin(), amounts1.end(), amounts2.begin(), amounts2.end());
+
COutPoint txout1{Txid::FromUint256(uint256{100}), 200};
COutPoint txout2{foo->passOutPoint(txout1)};
BOOST_CHECK(txout1 == txout2);
</details>