Utility template for proxying token standard choices so that featured app markers are created for a wallet app provider by their users when they are using token standard workflows. You can either use this template directly, or copy the code under a different package name and a different module name. Note: use theDocumentation Index
Fetch the complete documentation index at: https://docs.canton.network/llms.txt
Use this file to discover all available pages before exploring further.
DelegateProxy if you are building an app that uses multiple parties for its own operations.
Templates
template WalletUserProxy
A proxy to attribute the activity of a wallet user to the wallet app provider. The intended usage is for the wallet app provider toNote that the weights are specified on the proxy contract, so that they are under the providers control. If they were specified on the choices, then the user could in principle change them, and grant themselves a higher reward than intended. Note also that the batch transfer support can be used without having a featured app right. Signatory: provider
- create a
WalletUserProxycontract with theproviderset to the app provider’s party- setup their wallet frontend such that users call the proxy’s choices instead of the original token standard choices.
Field Type Description provider Party The app provider whose featured app right should be triggered providerWeight Decimal Reward weight for the provider userWeight Decimal Reward weight for the user, set to 0.0 if the user should not receive a reward extraBeneficiaries [AppRewardBeneficiary] Extra beneficiaries to add optAllowList Optional [Party] An optional allow list of parties that can use the proxy
- Choice Archive Controller: provider Returns: () (no fields)
Choice WalletUserProxy_AllocationFactory_AllocateController: (DA.Internal.Record.getField @“user” proxyArg) Returns: ProxyResult AllocationInstructionResult
Field Type Description cid ContractId AllocationFactory proxyArg ProxyArg AllocationFactory_Allocate Choice WalletUserProxy_Allocation_WithdrawController: (DA.Internal.Record.getField @“user” proxyArg) Returns: ProxyResult Allocation_WithdrawResult
Field Type Description cid ContractId Allocation proxyArg ProxyArg Allocation_Withdraw Choice WalletUserProxy_BatchTransferController: getFirstSender transferCalls Returns: WalletUserProxy_BatchTransferResult
Field Type Description transferCalls [TransferFactoryCall] Transfers to execute via their respective transfer factories. Input holdings are properly threaded through for all instrument-ids. The sender change is always added back as an additional input to follow-up transfers for the same instrument-ids. Note that we accept fully specified calls to factories for maximum flexibility. Some token admins may actually use different factories for different recipients, e.g., to implement preapprovals. optFeaturedAppRightCid Optional (ContractId FeaturedAppRight) The featured app right contract of the provider to use on every transfer. Optional so the batched choice can be used without a featured app right. Choice WalletUserProxy_PublicFetchController: actor Returns: WalletUserProxy
Field Type Description actor Party Choice WalletUserProxy_TransferFactory_TransferController: (DA.Internal.Record.getField @“user” proxyArg) Returns: ProxyResult TransferInstructionResult
Field Type Description cid ContractId TransferFactory proxyArg ProxyArg TransferFactory_Transfer Choice WalletUserProxy_TransferInstruction_AcceptController: (DA.Internal.Record.getField @“user” proxyArg) Returns: ProxyResult TransferInstructionResult
Field Type Description cid ContractId TransferInstruction proxyArg ProxyArg TransferInstruction_Accept Choice WalletUserProxy_TransferInstruction_RejectController: (DA.Internal.Record.getField @“user” proxyArg) Returns: ProxyResult TransferInstructionResult
Field Type Description cid ContractId TransferInstruction proxyArg ProxyArg TransferInstruction_Reject Choice WalletUserProxy_TransferInstruction_WithdrawController: (DA.Internal.Record.getField @“user” proxyArg) Returns: ProxyResult TransferInstructionResult
Field Type Description cid ContractId TransferInstruction proxyArg ProxyArg TransferInstruction_Withdraw
Data Types
type InstrumentHoldingMap
= Map InstrumentId [ContractId Holding]instance GetField “senderChangeMap” WalletUserProxy_BatchTransferResult InstrumentHoldingMapinstance SetField “senderChangeMap” WalletUserProxy_BatchTransferResult InstrumentHoldingMap
data ProxyArg arg
Generic argument to the proxy choices.ProxyArginstance Eq arg => Eq (ProxyArg arg) instance Show arg => Show (ProxyArg arg) instance GetField “choiceArg” (ProxyArg arg) arg instance GetField “featuredAppRightCid” (ProxyArg arg) (ContractId FeaturedAppRight) instance GetField “proxyArg” WalletUserProxy_AllocationFactory_Allocate (ProxyArg AllocationFactory_Allocate) instance GetField “proxyArg” WalletUserProxy_Allocation_Withdraw (ProxyArg Allocation_Withdraw) instance GetField “proxyArg” WalletUserProxy_TransferFactory_Transfer (ProxyArg TransferFactory_Transfer) instance GetField “proxyArg” WalletUserProxy_TransferInstruction_Accept (ProxyArg TransferInstruction_Accept) instance GetField “proxyArg” WalletUserProxy_TransferInstruction_Reject (ProxyArg TransferInstruction_Reject) instance GetField “proxyArg” WalletUserProxy_TransferInstruction_Withdraw (ProxyArg TransferInstruction_Withdraw) instance GetField “user” (ProxyArg arg) Party instance SetField “choiceArg” (ProxyArg arg) arg instance SetField “featuredAppRightCid” (ProxyArg arg) (ContractId FeaturedAppRight) instance SetField “proxyArg” WalletUserProxy_AllocationFactory_Allocate (ProxyArg AllocationFactory_Allocate) instance SetField “proxyArg” WalletUserProxy_Allocation_Withdraw (ProxyArg Allocation_Withdraw) instance SetField “proxyArg” WalletUserProxy_TransferFactory_Transfer (ProxyArg TransferFactory_Transfer) instance SetField “proxyArg” WalletUserProxy_TransferInstruction_Accept (ProxyArg TransferInstruction_Accept) instance SetField “proxyArg” WalletUserProxy_TransferInstruction_Reject (ProxyArg TransferInstruction_Reject) instance SetField “proxyArg” WalletUserProxy_TransferInstruction_Withdraw (ProxyArg TransferInstruction_Withdraw) instance SetField “user” (ProxyArg arg) Party
Field Type Description user Party The wallet user that is using the wallet to exercise a choice. choiceArg arg The argument to the choice that the user is exercising. featuredAppRightCid ContractId FeaturedAppRight The featured app right contract of the provider.
data ProxyResult r
Generic result of the proxy choices.ProxyResultinstance GetField “choiceResult” (ProxyResult r) r instance GetField “markerResult” (ProxyResult r) FeaturedAppRight_CreateActivityMarkerResult instance SetField “choiceResult” (ProxyResult r) r instance SetField “markerResult” (ProxyResult r) FeaturedAppRight_CreateActivityMarkerResult instance HasExercise WalletUserProxy WalletUserProxy_AllocationFactory_Allocate (ProxyResult AllocationInstructionResult) instance HasExercise WalletUserProxy WalletUserProxy_Allocation_Withdraw (ProxyResult Allocation_WithdrawResult) instance HasExercise WalletUserProxy WalletUserProxy_TransferFactory_Transfer (ProxyResult TransferInstructionResult) instance HasExercise WalletUserProxy WalletUserProxy_TransferInstruction_Accept (ProxyResult TransferInstructionResult) instance HasExercise WalletUserProxy WalletUserProxy_TransferInstruction_Reject (ProxyResult TransferInstructionResult) instance HasExercise WalletUserProxy WalletUserProxy_TransferInstruction_Withdraw (ProxyResult TransferInstructionResult) instance HasFromAnyChoice WalletUserProxy WalletUserProxy_AllocationFactory_Allocate (ProxyResult AllocationInstructionResult) instance HasFromAnyChoice WalletUserProxy WalletUserProxy_Allocation_Withdraw (ProxyResult Allocation_WithdrawResult) instance HasFromAnyChoice WalletUserProxy WalletUserProxy_TransferFactory_Transfer (ProxyResult TransferInstructionResult) instance HasFromAnyChoice WalletUserProxy WalletUserProxy_TransferInstruction_Accept (ProxyResult TransferInstructionResult) instance HasFromAnyChoice WalletUserProxy WalletUserProxy_TransferInstruction_Reject (ProxyResult TransferInstructionResult) instance HasFromAnyChoice WalletUserProxy WalletUserProxy_TransferInstruction_Withdraw (ProxyResult TransferInstructionResult) instance HasToAnyChoice WalletUserProxy WalletUserProxy_AllocationFactory_Allocate (ProxyResult AllocationInstructionResult) instance HasToAnyChoice WalletUserProxy WalletUserProxy_Allocation_Withdraw (ProxyResult Allocation_WithdrawResult) instance HasToAnyChoice WalletUserProxy WalletUserProxy_TransferFactory_Transfer (ProxyResult TransferInstructionResult) instance HasToAnyChoice WalletUserProxy WalletUserProxy_TransferInstruction_Accept (ProxyResult TransferInstructionResult) instance HasToAnyChoice WalletUserProxy WalletUserProxy_TransferInstruction_Reject (ProxyResult TransferInstructionResult) instance HasToAnyChoice WalletUserProxy WalletUserProxy_TransferInstruction_Withdraw (ProxyResult TransferInstructionResult)
Field Type Description markerResult FeaturedAppRight_CreateActivityMarkerResult choiceResult r
data TransferFactoryCall
A call to the token standard factory to initiate a token standard transfer. Specialized because it is used in the batch transfer choice below.TransferFactoryCallinstance Eq TransferFactoryCall instance Show TransferFactoryCall instance GetField “choiceArg” TransferFactoryCall TransferFactory_Transfer instance GetField “factoryCid” TransferFactoryCall (ContractId TransferFactory) instance GetField “transferCalls” WalletUserProxy_BatchTransfer [TransferFactoryCall] instance SetField “choiceArg” TransferFactoryCall TransferFactory_Transfer instance SetField “factoryCid” TransferFactoryCall (ContractId TransferFactory) instance SetField “transferCalls” WalletUserProxy_BatchTransfer [TransferFactoryCall]
Field Type Description factoryCid ContractId TransferFactory choiceArg TransferFactory_Transfer
data WalletUserProxy_BatchTransferResult
WalletUserProxy_BatchTransferResultinstance Eq WalletUserProxy_BatchTransferResult instance Show WalletUserProxy_BatchTransferResult instance GetField “senderChangeMap” WalletUserProxy_BatchTransferResult InstrumentHoldingMap instance GetField “transferResults” WalletUserProxy_BatchTransferResult [TransferInstructionResult] instance SetField “senderChangeMap” WalletUserProxy_BatchTransferResult InstrumentHoldingMap instance SetField “transferResults” WalletUserProxy_BatchTransferResult [TransferInstructionResult] instance HasExercise WalletUserProxy WalletUserProxy_BatchTransfer WalletUserProxy_BatchTransferResult instance HasFromAnyChoice WalletUserProxy WalletUserProxy_BatchTransfer WalletUserProxy_BatchTransferResult instance HasToAnyChoice WalletUserProxy WalletUserProxy_BatchTransfer WalletUserProxy_BatchTransferResult
Field Type Description transferResults [TransferInstructionResult] senderChangeMap InstrumentHoldingMap
Functions
getFirstSender
: [TransferFactoryCall] -> PartyDetermine the sender of the transfer in the first call.
runBatch
: WalletUserProxy -> WalletUserProxy_BatchTransfer -> Update WalletUserProxy_BatchTransferResultValidate the batch call and run it
executeTransferCalls
: WalletUserProxy -> Party -> Optional (ContractId FeaturedAppRight) -> [TransferFactoryCall] -> InstrumentHoldingMap -> [TransferInstructionResult] -> Update WalletUserProxy_BatchTransferResultRun the individual transfer calls in the batch with proper threading of input holdings.
exerciseProxyChoice
: HasExercise t ch r => WalletUserProxy -> ContractId t -> ProxyArg ch -> (ContractId t -> Update Party) -> Update (ProxyResult r)Shared code to execute the proxied choice.
validateAppRight
: WalletUserProxy -> ContractId FeaturedAppRight -> Update ()
createAppMarker
: WalletUserProxy -> Party -> ContractId FeaturedAppRight -> Update FeaturedAppRight_CreateActivityMarkerResult
proxyBeneficiaries
: WalletUserProxy -> Party -> [AppRewardBeneficiary]Get the list of beneficiaries for the featured app marker.
validProxy
: WalletUserProxy -> Bool