@@ -1730,6 +1730,20 @@ sets of 20 words is difficult, error-prone and time consuming.
17301730 the many intermediary banking industry and government parties involved in any traditional
17311731 financial transaction, even if you are not convicted of a crime.
17321732
1733+ Even if such payments are allowed, and none of the counterparties are actively hostile to you, the
1734+ complexity and expense of quoting a price, signing a client, invoicing for payment, confirming the
1735+ validity of the invoice and making the payment, monitoring for incoming payments and associating
1736+ them with the correct invoices, conforming amounts paid are correct, issuing a receipt,
1737+ book-keeping the incoming payment, converting currencies, retaining the correct taxes for each
1738+ counterparty jurisdiction, reconciling books, and finally preparing and filing taxes, and then
1739+ (perhaps years later) defending your accounting decisions against a hostile tax inspector with
1740+ infinite funds to prosecute -- all this makes it virtually impossible for a small business to
1741+ survive. Furthermore, you must accomplish all this, *without error*, while attempting to defend
1742+ yourself against business adversaries with preferential tax treatment, office-towers full of
1743+ lawyers and accountants, for whom the total percentage of gross revenues paid to accomplish
1744+ compliance is less than 1%, while the small business is likely to spend 10% to 25% of
1745+ their entire gross revenue *just* to financial and regulatory compliance overheads.
1746+
17331747 Fortunately, DeFi (Decentralized Finance) provides you with the capability to receive payments,
17341748 quickly and efficiently, from anyone on the planet who wishes to pay you for your services.
17351749
@@ -1804,53 +1818,62 @@ sets of 20 words is difficult, error-prone and time consuming.
18041818 storing an immutable value associated with the "salt" value from which the "Forwarder" account
18051819 address is derived.
18061820
1807- *** Client "Forwarder" Contract
1821+ *** The Client "Forwarder" Contract
18081822
18091823 Once the product's =MultiPayoutERC20= "Fee Distribution" contract address is identified, the act
18101824 of obtaining a unique client payee "Forwarder" address is simple.
18111825
18121826 1) A "salt" value unique to the client is deduced, usually consisting of "something they know"
1813- (eg. a Public Key) plus "something they have" (eg. a Machine ID).
1827+ (eg. a Public Key) plus "something they have" (eg. a Machine ID, or a User Name ).
18141828 2) The salt is used to deduce the client's unique "Forwarder" address
18151829
1816- Here 's an example (using the Ethereum "Goerli" testnet):
1830+ **** The Product Owner 's MultiPayoutERC20 Contract
18171831
1818- #+LATEX: {\scriptsize
1819- #+BEGIN_SRC ipython :session :exports both :results output raw drawer
1832+ The creation of a =MultiPayoutERC20= is simple.
18201833
1821- # Provide yourself with a Goerli testnet account under your control;
1822- # provide an "xpub..." key for it, or the BIP-39 Mnemonic phrase to
1823- # derive its HD wallet. Use the https://goerlifaucet.com to fund the
1824- # account with some Goerli test Ethereum; requires you to set up an
1825- # https://alchemy.com account, and put your API token in the
1826- # ALCHEMY_API_TOKEN environment variable.
1827- goerli_xprvkey = os.getenv( 'GOERLI_XPRVKEY' )
1828- if not goerli_xprvkey:
1829- goerli_seed = os.getenv( 'GOERLI_SEED' )
1830- if goerli_seed:
1831- try:
1832- # why m/44'/1'/... instead of m/44'/60'/...? Dunno;
1833- # That's the derivation path that Trezor Suite uses for
1834- # Goerli testnet wallets...
1835- goerli_xprvkey = slip39.account(
1836- goerli_seed, crypto="ETH", path="m/44'/1'/0'"
1837- ).xprvkey
1838- except Exception:
1839- pass
1840- if goerli_xprvkey:
1841- # the Account.address/.prvkey
1842- goerli_src = slip39.account(
1843- goerli_xprvkey, crypto='ETH', path="m/0/0"
1844- )
1845-
1846- from slip39.invoice import MultiPayoutERC20
1847-
1848- mp = MultiPayoutERC20(
1849- agent = goerli_src.address,
1850- agent_prvkey = goerli_src.prvkey,
1851- address = "0xb2D03aD9a84F0E10697BF2CDc2B98765688134d8",
1852- )
1853- salt
1834+ The product owner must know the Ethereum addresses of the payees, and each payee's proportion
1835+ of the product revenue. A payee may be another MultiPayoutERC20 contract (eg. for a product
1836+ module sub-license), which may in turn have its own payees.
1837+
1838+ An Ethereum account containing sufficient funds to establish the MultiPayoutERC20 contract must
1839+ be available. Here's an example (using the Ethereum "Goerli" testnet):
1840+
1841+ #+LATEX: {\scriptsize
1842+ #+BEGIN_SRC ipython :session :exports both :results output raw drawer
1843+
1844+ # Provide yourself with a Goerli testnet account under your control;
1845+ # provide an "xpub..." key for it, or the BIP-39 Mnemonic phrase to
1846+ # derive its HD wallet. Use the https://goerlifaucet.com to fund the
1847+ # account with some Goerli test Ethereum; requires you to set up an
1848+ # https://alchemy.com account, and put your API token in the
1849+ # ALCHEMY_API_TOKEN environment variable.
1850+ goerli_xprvkey = os.getenv( 'GOERLI_XPRVKEY' )
1851+ if not goerli_xprvkey:
1852+ goerli_seed = os.getenv( 'GOERLI_SEED' )
1853+ if goerli_seed:
1854+ try:
1855+ # why m/44'/1'/... instead of m/44'/60'/...? Dunno;
1856+ # That's the derivation path that Trezor Suite uses for
1857+ # Goerli testnet wallets...
1858+ goerli_xprvkey = slip39.account(
1859+ goerli_seed, crypto="ETH", path="m/44'/1'/0'"
1860+ ).xprvkey
1861+ except Exception:
1862+ pass
1863+ if goerli_xprvkey:
1864+ # the Account.address/.prvkey
1865+ goerli_src = slip39.account(
1866+ goerli_xprvkey, crypto='ETH', path="m/0/0"
1867+ )
1868+
1869+ from slip39.invoice import MultiPayoutERC20
1870+
1871+ mp = MultiPayoutERC20(
1872+ agent = goerli_src.address,
1873+ agent_prvkey = goerli_src.prvkey,
1874+ address = "0xb2D03aD9a84F0E10697BF2CDc2B98765688134d8",
1875+ )
1876+ salt
18541877
18551878 #+END_SRC
18561879 #+LATEX: }
@@ -1863,8 +1886,8 @@ sets of 20 words is difficult, error-prone and time consuming.
18631886 payments to a plain Account (for which you hold the private key) may not be acceptable to all
18641887 parties involved. A product owner providing a licensee the capability to sub-licensing their
18651888 product may, for example, charge a much better fee, if the licensee can prove that payments will
1866- *automatically* flow back to the licensor , every time the licensee sells their product which
1867- contains the sub-license.
1889+ *automatically* flow back to the license owner , every time the licensee sells their product
1890+ which contains the sub-license.
18681891
18691892 There are ways to ensure that each client payment *must* be distributed to each payee, as agreed,
18701893 using cryptocurrencies which implement Smart Contracts.
0 commit comments