How to deal with voting rewards for AML purposes

I have some ICP locked in voting neurons. The neurons earn maturity, I can then spawn a neutron and dissolve the new neuron to unlock the ICP. However when viewed on IC rocks or this is shown simply as a mint transaction where ICP is created ex nihilo with no connection to either the original neutron or the principal.

My concern is that potentially for AML compliance purposes I might be required to prove the chain

  • I bought ICP for Fiat on an exchange → I locked it in a neurone → I spawned to create a new neurone → I dissolved → I transferred to an exchange and sold for Fiat.

But can only prove

  • I bought ICP for Fiat on an exchange → I locked it in a neurone
  • Someone spawned a new neurone → dissolved → transferred to an exchange → and I sold for Fiat.

I think it must be possible to prove that all these transactions were done by me because they were all done by the Principals I control. I also think that large holders like Dominic or A16Z must have a method for doing this. So the question is:

  • How can I prove the mint transaction was due to a call by my Principal?
  • What records/receipts should I keep for AML purposes when spawning neurons?
  • How can a compliance department verify that what I am telling them is correct.

I hate this stuff as much as anyone but need to sort it out to avoid a life ruining situation like:

  • Have huge tax bill because have income.
  • Cannot cash out because no bank can understand where the income came from.
2 Likes

This sounds like a good question for a knowledgable lawyer with banking experience / crypto experience

No, it is more of a technical question: How at the level of transactions, canisters and signatures do I prove that a mint was because of spawn & dissolve commands I initiated. More abstractly the question is “given there was a state change X which was recorded to the ledger how can I prove it happened because a signed message was sent at y time”

an alternative way of addressing it would be if there is a record of the maturity of a neuron I control being reset to zero at about the same time as the new neuron was spawned but AFAK that won’t work because the IC throws away historic state and also because records pertaining to dissolved neurons are deleted.

If I can prove that a principal controls an account that gets me halfway there. So I guess Q1) is given I have a principal (private key / internet identity) and I know the public address of an account how do I prove I control the address. (I’m about 70% certain a bank would accept that). But that isn’t quite sufficient to prove beyond doubt that someone else didn’t just spawn and dissolve a neurone and put it under my control.

I am NOT a financial advisor NOR a tax advisor. Nothing in this post should be considered financial or tax advice.

This is what I am doing:
I have two accounts tied to my principal.

Account A : manages all ICPs coming in from an exchange (i.e. FROM coinbase)
Account B: manages all ICPS going out to the exchange (i.e. TO coinbase)

I have four neurons that are currently staked and earning rewards:
N1
N2
N3
N4

The focus of this post is my Account B.

All ICP minted in a newly created neuron as rewards (from N1,N2,N3,N4) is subjected to immediate disolvement(this , of course, takes 7 days)

As soon as the newly mined neuron is dissolved, the balance is immediately transferred to Account B and from Account B to coinbase.

The amount of rewards earned is a mathematical formula and is dependent on the stake, how long has it been staked for and what is duration of lockup period; amongst other things,

Ok so what I’m thinking of doing is:

  • Calling get full neuron details that is a record of the maturity level before and after spawning. (Decrease at the same time as new neuron was spawned should count as evidence of where ICP came from)
  • Calling the spawn function from the command line but save the result which I assume should be of type record { created_neuron_id : opt NeuronId };

But what I’m not sure about is whether this response is signed and how you can verify that it has been signed by the chain key and is not just fake. I can’t see any documentation on (1) whether the responses to these functions are certificated variables (2) How to actually verify them from raw results.