Valence Reverse Splitter library
The Reverse Splitter library allows to route funds from one or more input account(s) to a single output account, for one or more token denom(s) according to the configured ratio(s). It is typically used as part of a Valence Program. In that context, a Processor contract will be the main contract interacting with the Forwarder library.
High-level flow
---
title: Reverse Splitter Library
---
graph LR
IA1((Input
Account1))
IA2((Input
Account2))
OA((Output
Account))
P[Processor]
S[Reverse Splitter
Library]
C[Contract]
P -- 1/Split --> S
S -- 2/Query balances --> IA1
S -- 2'/Query balances --> IA2
S -. 3/Query split ratio .-> C
S -- 4/Do Send funds --> IA1
S -- 4'/Do Send funds --> IA2
IA1 -- 5/Send funds --> OA
IA2 -- 5'/Send funds --> OA
Functions
| Function | Parameters | Description |
|---|---|---|
| Split | - | Split and route funds from the configured input account(s) to the output account, according to the configured token denom(s) and ratio(s). |
Configuration
The library is configured on instantiation via the LibraryConfig type.
#![allow(unused)] fn main() { struct LibraryConfig { output_addr: LibraryAccountType, // Account to which the funds are sent. splits: Vec<UncheckedSplitConfig>, // Split configuration per denom. base_denom: UncheckedDenom // Base denom, used with ratios. } // Split config for specified account struct UncheckedSplitConfig { denom: UncheckedDenom, // Denom for this split configuration (either native or CW20). account: LibraryAccountType, // Address of the input account for this split config. amount: UncheckedSplitAmount, // Fixed amount of tokens or an amount defined based on a ratio. factor: Option<u64> // Multiplier relative to other denoms (only used if a ratio is specified). } // Ratio configuration, either fixed & dynamically calculated enum UncheckedRatioConfig { FixedAmount(Uint128), // Fixed amount of tokens FixedRatio(Decimal), // Fixed ratio e.g. 0.0262 for NTRN/STARS (or could be another arbitrary ratio) DynamicRatio { // Dynamic ratio calculation (delegated to external contract) contract_addr: "<TWAP Oracle wrapper contract address>", params: "base64-encoded arbitrary payload to send in addition to the denoms" } } // Standard query & response for contract computing a dynamic ratio // for the Splitter & Reverse Splitter libraries. #[cw_serde] #[derive(QueryResponses)] pub enum DynamicRatioQueryMsg { #[returns(DynamicRatioResponse)] DynamicRatio { denoms: Vec<String>, params: String, } } #[cw_serde] // Response returned by the external contract for a dynamic ratio struct DynamicRatioResponse { pub denom_ratios: HashMap<String, Decimal>, } }