From 8334304c168a65935be2aa5682b8eb5e21c4200d Mon Sep 17 00:00:00 2001 From: John Tromp Date: Thu, 26 Nov 2020 20:46:03 +0100 Subject: [PATCH] fixfees on grin-wallet (#526) * change fee to fee_fields in various structs and fix tests for new fee calculation * set up accept_fee_base param in grin-wallet.toml * fix bug and adopt new tx_fee interface * Fix doctests * Remove left over debug statement * revert field name feef to fee to remain slate compatible * use into() for some literal fee_fields * add height arguments to FeeFields methods where necessary * Fix tests * Rename fee_fields -> fee on Context * Rename fee_fields -> fee on TxLogEntry * Update to grin master * replace fee(0) by fee(2*YEAR_HEIGHT) to get fee masking * Fix compilation error and revert Cargo lock * fix wrong height passed into next_difficulty Co-authored-by: Jasper van der Maarel --- Cargo.lock | 16 +++---- api/src/foreign_rpc.rs | 32 ++++++------- api/src/owner_rpc.rs | 46 +++++++++---------- config/src/comments.rs | 8 +++- config/src/types.rs | 15 +++++++ controller/src/command.rs | 7 +-- controller/src/display.rs | 18 ++++---- controller/tests/no_change.rs | 2 +- controller/tests/transaction.rs | 16 ++++--- impls/src/node_clients/http.rs | 2 +- impls/src/test_framework/mod.rs | 5 ++- libwallet/src/api_impl/foreign.rs | 3 +- libwallet/src/api_impl/owner.rs | 12 ++--- libwallet/src/internal/selection.rs | 19 ++++---- libwallet/src/internal/tx.rs | 15 ++++--- libwallet/src/slate.rs | 62 +++++++++++++------------- libwallet/src/slate_versions/v4.rs | 23 ++++++---- libwallet/src/slate_versions/v4_bin.rs | 18 +++++--- libwallet/src/types.rs | 8 ++-- libwallet/tests/libwallet.rs | 9 ++-- src/bin/grin-wallet.rs | 2 + 21 files changed, 197 insertions(+), 141 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 72f243df8..eb7c7e0f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1171,7 +1171,7 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "grin_api" version = "4.2.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#cf2a65242d9805b0688e40f2432250461aa56561" +source = "git+https://github.com/mimblewimble/grin#48efb693e2e5cdf60449b7f009214491d5bf3646" dependencies = [ "bytes", "easy-jsonrpc-mw", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "grin_chain" version = "4.2.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#cf2a65242d9805b0688e40f2432250461aa56561" +source = "git+https://github.com/mimblewimble/grin#48efb693e2e5cdf60449b7f009214491d5bf3646" dependencies = [ "bit-vec", "bitflags 1.2.1", @@ -1228,7 +1228,7 @@ dependencies = [ [[package]] name = "grin_core" version = "4.2.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#cf2a65242d9805b0688e40f2432250461aa56561" +source = "git+https://github.com/mimblewimble/grin#48efb693e2e5cdf60449b7f009214491d5bf3646" dependencies = [ "blake2-rfc", "byteorder", @@ -1255,7 +1255,7 @@ dependencies = [ [[package]] name = "grin_keychain" version = "4.2.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#cf2a65242d9805b0688e40f2432250461aa56561" +source = "git+https://github.com/mimblewimble/grin#48efb693e2e5cdf60449b7f009214491d5bf3646" dependencies = [ "blake2-rfc", "byteorder", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "grin_p2p" version = "4.2.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#cf2a65242d9805b0688e40f2432250461aa56561" +source = "git+https://github.com/mimblewimble/grin#48efb693e2e5cdf60449b7f009214491d5bf3646" dependencies = [ "bitflags 1.2.1", "bytes", @@ -1299,7 +1299,7 @@ dependencies = [ [[package]] name = "grin_pool" version = "4.2.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#cf2a65242d9805b0688e40f2432250461aa56561" +source = "git+https://github.com/mimblewimble/grin#48efb693e2e5cdf60449b7f009214491d5bf3646" dependencies = [ "blake2-rfc", "chrono", @@ -1333,7 +1333,7 @@ dependencies = [ [[package]] name = "grin_store" version = "4.2.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#cf2a65242d9805b0688e40f2432250461aa56561" +source = "git+https://github.com/mimblewimble/grin#48efb693e2e5cdf60449b7f009214491d5bf3646" dependencies = [ "byteorder", "croaring-mw", @@ -1353,7 +1353,7 @@ dependencies = [ [[package]] name = "grin_util" version = "4.2.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#cf2a65242d9805b0688e40f2432250461aa56561" +source = "git+https://github.com/mimblewimble/grin#48efb693e2e5cdf60449b7f009214491d5bf3646" dependencies = [ "backtrace", "base64 0.12.3", diff --git a/api/src/foreign_rpc.rs b/api/src/foreign_rpc.rs index c6cf150b3..b3d6ab9eb 100644 --- a/api/src/foreign_rpc.rs +++ b/api/src/foreign_rpc.rs @@ -128,7 +128,7 @@ pub trait ForeignRpc { "params": [ { "amt": "6000000000", - "fee": "8000000", + "fee": "23500000", "id": "0436430c-2b02-624c-2032-570501212b00", "off": "d202964900000000d302964900000000d402964900000000d502964900000000", "proof": { @@ -137,7 +137,7 @@ pub trait ForeignRpc { }, "sigs": [ { - "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", + "nonce": "02b57c1f4fea69a3ee070309cf8f06082022fe06f25a9be1851b56ef0fa18f25d6", "xs": "023878ce845727f3a4ec76ca3f3db4b38a2d05d636b8c3632108b857fed63c96de" } ], @@ -172,7 +172,7 @@ pub trait ForeignRpc { "sigs": [ { "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841babbc82d2e200efe3a3b70cdfbed5b4e1d2a87641d0c4f6a3d7e73b80facb8507", + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841be4f81215c8e678c7bd5f04f3562388948864d7a5a0374e220ab6dc5e02bae66f", "xs": "02e3c128e436510500616fef3f9a22b15ca015f407c8c5cf96c9059163c873828f" } ], @@ -209,13 +209,13 @@ pub trait ForeignRpc { "ver": "4:2", "id": "0436430c-2b02-624c-2032-570501212b00", "sta": "I2", - "off": "dbd68b83e4d6f9ebaebf179fdde3efd4309734124937bcb5f5a7df49120eca7f", - "fee": "7000000", + "off": "383bc9df0dd332629520a0a72f8dd7f0e97d579dccb4dbdc8592aa3d424c846c", + "fee": "23500000", "sigs": [ { - "xs": "0384a71f13c434e79b70f9a0649e34887f1c6caf3021636cfced448a146ca23c7a", + "xs": "02e3c128e436510500616fef3f9a22b15ca015f407c8c5cf96c9059163c873828f", "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b6485299a0be2e4306663dcc78f1bc9d029c7be30e423558fe3f4fcfc9ad79a8e" + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841be7bf31d80494f5e4a3d656649b1610c61a268f9cafcfc604b5d9f25efb2aa3c5" } ], "coms": [ @@ -228,8 +228,8 @@ pub trait ForeignRpc { "c": "08e1da9e6dc4d6e808a718b2f110a991dd775d65ce5ae408a4e1f002a4961aa9e7" }, { - "c": "0812276cc788e6870612296d926cba9f0e7b9810670710b5a6e6f1ba006d395774", - "p": "284b9f9199411c6bbf7227eae15cc9fa7ed30534af3ecff85b0d016da329cae1f1edf79f01426434cb90afcc2f0a1fb296e5c51a91b5e57a1f0230fda4f8c5950e7986fa379b99d64b6039a86cc7e35e040ba192b781043959851268ca9874a918805ea958c84f7fee8d3ab4262f032f5a3f840ebcdd273b29be810114e6e86a959d8e4c080572e3ef249edd6ad68503ec3bc4486548520ea2775a41aea67aac99945fce9e7a7769d71f893ad7f0d0108692f6b6852312cae6f9857063055bda59dce521927c70040b8026a41b6517cae0a1c947ca244984a5c0adf7c6483b0939346c48f61cac37d501f46a1c5878b67cee0d0723f4eeadc9f5d71ed5e9f33b4294b58d3ebeefeaa13f20357599be549ce18e6e2eb1d50e1235ccc40ec9184c68a623741a7238ce69aa3a1d25156b3b7eb38fdd6fbe5473979feee3317df279c60d48a289826aa4c76dbce24d526890d4e6e2f83e80f674a1248fc1dc037d982009012ae1133f5e158ae6cdadb18c8d53e4a8ae5595c758782c67aa0c20f146d52085cf45a35794cec45702830f8952a69744718fbe6fe0d3da66e348dd3473a0aced7080fbf5494c3e7e141916f3b135b33277f998fcd9acfbca8709814866e9838a5dcda4c29422cf157293e6fc2ccc2d25423517843bd8e21c61ced72312c0b48814c312021b0d31598d2389b0b329baa1169922a4c34173dd5f540545be5066a0f291f1a870e1aaff94c19f0a855254882a17984baeda08e8ead53d1563e9ee4bc36742789cef4f3ab158054d7ddfe2a2b37b5a8a30be84ff7df9a7d758a9b76751a3622057721a3ec5b873582d0c91cd1febbc153662739854ea15c9903023c193c6b5768b55484108f897cdc47d13a9088b32558e57f12f5807668649c99a17b51905127340e8b49c42775f1b3cab072dfad33d33cc1e4ba5964d728ed0a905" + "c": "09ede20409d5ae0d1c0d3f3d2c68038a384cdd6b7cc5ca2aab670f570adc2dffc3", + "p": "6d86fe00220f8c6ac2ad4e338d80063dba5423af525bd273ecfac8ef6b509192732a8cd0c53d3313e663ac5ccece3d589fd2634e29f96e82b99ca6f8b953645a005d1bc73493f8c41f84fb8e327d4cbe6711dba194a60db30700df94a41e1fda7afe0619169389f8d8ee12bddf736c4bc86cd5b1809a5a27f195209147dc38d0de6f6710ce9350f3b8e7e6820bfe5182e6e58f0b41b82b6ec6bb01ffe1d8b3c2368ebf1e31dfdb9e00f0bc68d9119a38d19c038c29c7b37e31246e7bba56019bc88881d7d695d32557fc0e93635b5f24deffefc787787144e5de7e86281e79934e7e20d9408c34317c778e6b218ee26d0a5e56b8b84a883e3ddf8603826010234531281486454f8c2cf3fee074f242f9fc1da3c6636b86fb6f941eb8b633d6e3b3f87dfe5ae261a40190bd4636f433bcdd5e3400255594e282c5396db8999d95be08a35be9a8f70fdb7cf5353b90584523daee6e27e208b2ca0e5758b8a24b974dca00bab162505a2aa4bcefd8320f111240b62f861261f0ce9b35979f9f92da7dd6989fe1f41ec46049fd514d9142ce23755f52ec7e64df2af33579e9b8356171b91bc96b875511bef6062dd59ef3fe2ddcc152147554405b12c7c5231513405eb062aa8fa093e3414a144c544d551c4f1f9bf5d5d2ff5b50a3f296c800907704bed8d8ee948c0855eff65ad44413af641cdc68a06a7c855be7ed7dd64d5f623bbc9645763d48774ba2258240a83f8f89ef84d21c65bcb75895ebca08b0090b40aafb7ddef039fcaf4bad2dbbac72336c4412c600e854d368ed775597c15d2e66775ab47024ce7e62fd31bf90b183149990c10b5b678501dbac1af8b2897b67d085d87cab7af4036cba3bdcfdcc7548d7710511045813c6818d859e192e03adc0d6a6b30c4cbac20a0d6f8719c7a9c3ad46d62eec464c4c44b58fca463fea3ce1fc51" } ] }] @@ -256,22 +256,22 @@ pub trait ForeignRpc { "p": "29701ceae262cac77b79b868c883a292e61e6de8192b868edcd1300b0973d91396b156ace6bd673402a303de10ddd8a5e6b7f17ba6557a574a672bd04cc273ab04ed8e2ca80bac483345c0ec843f521814ce1301ec9adc38956a12b4d948acce71295a4f52bcdeb8a1c9f2d6b2da5d731262a5e9c0276ef904df9ef8d48001420cd59f75a2f1ae5c7a1c7c6b9f140e7613e52ef9e249f29f9340b7efb80699e460164324616f98fd4cde3db52497c919e95222fffeacb7e65deca7e368a80ce713c19de7da5369726228ee336f5bd494538c12ccbffeb1b9bfd5fc8906d1c64245b516f103fa96d9c56975837652c1e0fa5803d7ccf1147d8f927e36da717f7ad79471dbe192f5f50f87a79fc3fe030dba569b634b92d2cf307993cce545633af263897cd7e6ebf4dcafb176d07358bdc38d03e45a49dfa9c8c6517cd68d167ffbf6c3b4de0e2dd21909cbad4c467b84e5700be473a39ac59c669d7c155c4bcab9b8026eea3431c779cd277e4922d2b9742e1f6678cbe869ec3b5b7ef4132ddb6cdd06cf27dbeb28be72b949fa897610e48e3a0d789fd2eea75abc97b3dc7e00e5c8b3d24e40c6f24112adb72352b89a2bef0599345338e9e76202a3c46efa6370952b2aca41aadbae0ea32531acafcdab6dd066d769ebf50cf4f3c0a59d2d5fa79600a207b9417c623f76ad05e8cccfcd4038f9448bc40f127ca7c0d372e46074e334fe49f5a956ec0056f4da601e6af80eb1a6c4951054869e665b296d8c14f344ca2dc5fdd5df4a3652536365a1615ad9b422165c77bf8fe65a835c8e0c41e070014eb66ef8c525204e990b3a3d663c1e42221b496895c37a2f0c1bf05e91235409c3fe3d89a9a79d6c78609ab18a463311911f71fa37bb73b15fcd38143d1404fd2ce81004dc7ff89cf1115dcc0c35ce1c1bf9941586fb959770f2618ccb7118a7" }, { - "c": "0812276cc788e6870612296d926cba9f0e7b9810670710b5a6e6f1ba006d395774", - "p": "284b9f9199411c6bbf7227eae15cc9fa7ed30534af3ecff85b0d016da329cae1f1edf79f01426434cb90afcc2f0a1fb296e5c51a91b5e57a1f0230fda4f8c5950e7986fa379b99d64b6039a86cc7e35e040ba192b781043959851268ca9874a918805ea958c84f7fee8d3ab4262f032f5a3f840ebcdd273b29be810114e6e86a959d8e4c080572e3ef249edd6ad68503ec3bc4486548520ea2775a41aea67aac99945fce9e7a7769d71f893ad7f0d0108692f6b6852312cae6f9857063055bda59dce521927c70040b8026a41b6517cae0a1c947ca244984a5c0adf7c6483b0939346c48f61cac37d501f46a1c5878b67cee0d0723f4eeadc9f5d71ed5e9f33b4294b58d3ebeefeaa13f20357599be549ce18e6e2eb1d50e1235ccc40ec9184c68a623741a7238ce69aa3a1d25156b3b7eb38fdd6fbe5473979feee3317df279c60d48a289826aa4c76dbce24d526890d4e6e2f83e80f674a1248fc1dc037d982009012ae1133f5e158ae6cdadb18c8d53e4a8ae5595c758782c67aa0c20f146d52085cf45a35794cec45702830f8952a69744718fbe6fe0d3da66e348dd3473a0aced7080fbf5494c3e7e141916f3b135b33277f998fcd9acfbca8709814866e9838a5dcda4c29422cf157293e6fc2ccc2d25423517843bd8e21c61ced72312c0b48814c312021b0d31598d2389b0b329baa1169922a4c34173dd5f540545be5066a0f291f1a870e1aaff94c19f0a855254882a17984baeda08e8ead53d1563e9ee4bc36742789cef4f3ab158054d7ddfe2a2b37b5a8a30be84ff7df9a7d758a9b76751a3622057721a3ec5b873582d0c91cd1febbc153662739854ea15c9903023c193c6b5768b55484108f897cdc47d13a9088b32558e57f12f5807668649c99a17b51905127340e8b49c42775f1b3cab072dfad33d33cc1e4ba5964d728ed0a905" + "c": "09ede20409d5ae0d1c0d3f3d2c68038a384cdd6b7cc5ca2aab670f570adc2dffc3", + "p": "6d86fe00220f8c6ac2ad4e338d80063dba5423af525bd273ecfac8ef6b509192732a8cd0c53d3313e663ac5ccece3d589fd2634e29f96e82b99ca6f8b953645a005d1bc73493f8c41f84fb8e327d4cbe6711dba194a60db30700df94a41e1fda7afe0619169389f8d8ee12bddf736c4bc86cd5b1809a5a27f195209147dc38d0de6f6710ce9350f3b8e7e6820bfe5182e6e58f0b41b82b6ec6bb01ffe1d8b3c2368ebf1e31dfdb9e00f0bc68d9119a38d19c038c29c7b37e31246e7bba56019bc88881d7d695d32557fc0e93635b5f24deffefc787787144e5de7e86281e79934e7e20d9408c34317c778e6b218ee26d0a5e56b8b84a883e3ddf8603826010234531281486454f8c2cf3fee074f242f9fc1da3c6636b86fb6f941eb8b633d6e3b3f87dfe5ae261a40190bd4636f433bcdd5e3400255594e282c5396db8999d95be08a35be9a8f70fdb7cf5353b90584523daee6e27e208b2ca0e5758b8a24b974dca00bab162505a2aa4bcefd8320f111240b62f861261f0ce9b35979f9f92da7dd6989fe1f41ec46049fd514d9142ce23755f52ec7e64df2af33579e9b8356171b91bc96b875511bef6062dd59ef3fe2ddcc152147554405b12c7c5231513405eb062aa8fa093e3414a144c544d551c4f1f9bf5d5d2ff5b50a3f296c800907704bed8d8ee948c0855eff65ad44413af641cdc68a06a7c855be7ed7dd64d5f623bbc9645763d48774ba2258240a83f8f89ef84d21c65bcb75895ebca08b0090b40aafb7ddef039fcaf4bad2dbbac72336c4412c600e854d368ed775597c15d2e66775ab47024ce7e62fd31bf90b183149990c10b5b678501dbac1af8b2897b67d085d87cab7af4036cba3bdcfdcc7548d7710511045813c6818d859e192e03adc0d6a6b30c4cbac20a0d6f8719c7a9c3ad46d62eec464c4c44b58fca463fea3ce1fc51" } ], - "fee": "7000000", + "fee": "23500000", "id": "0436430c-2b02-624c-2032-570501212b00", - "off": "4940f497462b7140383738c1665fa3989e6fff5d9f411a33aa04438f75d6de2c", + "off": "a5a632f26f27a9b71e98c1c8b8098bb41204ffcfd206d995f9c16d10764ad95a", "sigs": [ { "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b6485299a0be2e4306663dcc78f1bc9d029c7be30e423558fe3f4fcfc9ad79a8e", - "xs": "0384a71f13c434e79b70f9a0649e34887f1c6caf3021636cfced448a146ca23c7a" + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841be7bf31d80494f5e4a3d656649b1610c61a268f9cafcfc604b5d9f25efb2aa3c5", + "xs": "02e3c128e436510500616fef3f9a22b15ca015f407c8c5cf96c9059163c873828f" }, { "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b32617ea149fa6faf220f4212530517809e9ed2193f5e558b1de9d339414fda91", + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b04e1e15ceb1b5dbab8baf7750d7bd4aad6cfe97b83e4dc080dae328eb75881fd", "xs": "02e89cce4499ac1e9bb498dab9e3fab93cc40cd3d26c04a0292e00f4bf272499ec" } ], diff --git a/api/src/owner_rpc.rs b/api/src/owner_rpc.rs index da5e835b9..3af1efb54 100644 --- a/api/src/owner_rpc.rs +++ b/api/src/owner_rpc.rs @@ -393,7 +393,7 @@ pub trait OwnerRpc { "result": { "Ok": { "amt": "6000000000", - "fee": "8000000", + "fee": "23000000", "id": "0436430c-2b02-624c-2032-570501212b00", "proof": { "raddr": "32cdd63928854f8b2628b1dce4626ddcdf35d56cb7cfdf7d64cca5822b78d4d3", @@ -521,17 +521,17 @@ pub trait OwnerRpc { "f": 1 }, { - "c": "094be57c91787fc2033d5d97fae099f1a6ddb37ea48370f1a138f09524c767fdd3", - "p": "1319630b26d02363861ebdb15514086dc8b0772b4bb63ef9b828704e0ac348efada6747dd7a29848138d630c7b403e573c9cde04be5d25f2d344db4b010d6b890dd6c54cc0911c0cadc7a8a225b2ec3f2dcac88189a17aa62257e969eef9de9172009d8e864e413f1953998b28531e580d3ea495a512d320e8d4ff50e7495a6c283c6e544d16364d34272805893526f1e3b6fd176ef4adc5671b165cf28efcfb8d25c0dfcd018a2c5e65beeb9201f3983194e5a521c0844d05c700654dfaed1b9b39dae08cc9afab9cb891256bc0237ad2ce78da8b44586580f52dd346dcafde5e471917f16e4c4b51e966e1946f13e31771503c85bb0f1b41d1c7fcc953e70af55400638a35e7f5610f9f4c5b881a35060a693deaf46e1839c54a8f7d2c626b05acd3450b72ae8f2e0f8721bcbbd8562141d3fef851c6ac3c8069fa6389389bc4fcba5e4fb49709a3b63a59ba96a82827dfbd6f16de849ef95f3114593d207aff6e030152929fa220b0c3b54ca419cfcbffb7a0106dd3154e858878c7d8f38cadcc376c502bdc50292b494484936d0846fc3fac10910962bca4ddcca5c80b458fd7df15e9a6c2f39b516425a2190a97c9d0e2e2f105ee29905f36e3a648a135ebf387d0bb2a6b61d95b215319d6dc9ee8b4b2798810fb6e01c007041b288c2b39e805c9af86c88dd4a380b6a346b4a0e67bba6aaac5acc70088ac3297486b90cfe371d9464552747a2f7680f42d5629fb09bed835382d842234712c0574c5b4f256c226e77602429983e4def71541cff80ccf4cd3b761685c91463c8e1c7bf828699c688509282b85e752424df3da670b3cfacdea2f66cfb804fecdf8b7eb056e8917fdae78d83c011964e3d5a0748873f817d0abf4b04c20452733eac35c318b96e100a5ace0f54085bd24f968b8fc5b276e0d7b134f01db50b3d2771cdcf1423d44" + "c": "087e4e373ef2ab9921ba53e05f384b717789ddb4ad18a8f2057c9338bd639e02a5", + "p": "28875d797af7cb6c63eba070e0a79af57ea0a434d7d34801a02bc85624ae14a4a13519164737c7154b6222a9d6da33b8c52ef7dc4dc58aea3c776b7907e474450a52f3ccc017f66e2ce9f97a45733d6ed90a223e7d1a67802d393834cc9e4103c27bb7d63abc2753a5b54bcc48751c63b6accde16a37678338452bc985d24fb6af405a9166c0ca750f1cdedc5c0996c56f199722df3844b822de96480fac6e706dab6241d0338d7914a10a0e83406d0689224a3286e8c579c50882ce96123aecc6aa667c27abf1ce894e0c6282fc81e5fba51d498af16c5b0c39b45faf3f0cd7140dccae7d8d45330ec7895ce0c90e2490877311b9dfe157c05c6206f929ffef0da1a8d807077712a80670dfb9ac38ca565d47acf7e93bd09f418f20f10c9e87f6f4421fa889e522c33475f98ddff87a36eb0a0b445a8679628e163ae56bf3cfc39a5a5867d3e31e1e9d373a6b3924d7d895d5140e4bf00c0cbf7f343c12dc2b2c6b01769a588cc1ef1178fbf3bd645e25bf5c458c4af79884329b7ed80e08868121baeb39b11814f2dd8dddbb7114382e65378e2c6f1e837ace9a980acb965629f9f1525f60efb54301a7540a9105bf33eac1be37e1add96801f1c62857be0ac38ac370e0722764c59517960056bafe6fdd388eb78c98954f3f966d44e8f060366617844eff416625f8609b44263efc10e4f2f4fb22ceae5c16d4105e477a49511b4ac37aefac17e5532ee1ccb1654eb0bf17b32415561f02c2b07462f2c5aa7846ef21cfb30548c6bfe4d762333a199be183d7d9fa1ae6c9b4730965f741183d75ac0610efcf48d0039514011816f421a7a1a4c7c1bbc2ba8b522178cff367b4c704d343fac3a2662b50211556b630b5620244587d2f90941ef1edf8e44fa97d35daaa58d16fff3f57c6e6fa618f511dc770704d831a1f49630ec9da6f33f551923c" } ], - "fee": "8000000", + "fee": "23000000", "id": "0436430c-2b02-624c-2032-570501212b00", - "off": "bca108f36955448dacfc0464d75d010641f9e1a81709c27bc4404eea895c4f91", + "off": "16672e6b4e2a6851b27641d8b5c32fcee83abbd516ceb9af5f0e8b6aad8d26a5", "sigs": [ { "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b20b8e09af72b6b7212c1bf6a4c17d56ce0048e05bb5309c1394a3d763a102a7e", + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841bdac2d36fe4c972de75f4e462004de9ca3e8c77d4dae5344d210beea9ad138c45", "xs": "02e3c128e436510500616fef3f9a22b15ca015f407c8c5cf96c9059163c873828f" } ], @@ -614,12 +614,12 @@ pub trait OwnerRpc { "ver": "4:2", "id": "0436430c-2b02-624c-2032-570501212b00", "sta": "S2", - "off": "696a69136154775485782121887bb3c32487a8320551fdb9702ec2d333fe54ee", + "off": "6c6a69136154775488782121887bb3c32787a8320551fdb9732ec2d333fe54ee", "sigs": [ { - "xs": "0384a71f13c434e79b70f9a0649e34887f1c6caf3021636cfced448a146ca23c7a", + "xs": "02e3c128e436510500616fef3f9a22b15ca015f407c8c5cf96c9059163c873828f", "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b6485299a0be2e4306663dcc78f1bc9d029c7be30e423558fe3f4fcfc9ad79a8e" + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841be7bf31d80494f5e4a3d656649b1610c61a268f9cafcfc604b5d9f25efb2aa3c5" } ], "coms": [ @@ -653,22 +653,22 @@ pub trait OwnerRpc { "p": "29701ceae262cac77b79b868c883a292e61e6de8192b868edcd1300b0973d91396b156ace6bd673402a303de10ddd8a5e6b7f17ba6557a574a672bd04cc273ab04ed8e2ca80bac483345c0ec843f521814ce1301ec9adc38956a12b4d948acce71295a4f52bcdeb8a1c9f2d6b2da5d731262a5e9c0276ef904df9ef8d48001420cd59f75a2f1ae5c7a1c7c6b9f140e7613e52ef9e249f29f9340b7efb80699e460164324616f98fd4cde3db52497c919e95222fffeacb7e65deca7e368a80ce713c19de7da5369726228ee336f5bd494538c12ccbffeb1b9bfd5fc8906d1c64245b516f103fa96d9c56975837652c1e0fa5803d7ccf1147d8f927e36da717f7ad79471dbe192f5f50f87a79fc3fe030dba569b634b92d2cf307993cce545633af263897cd7e6ebf4dcafb176d07358bdc38d03e45a49dfa9c8c6517cd68d167ffbf6c3b4de0e2dd21909cbad4c467b84e5700be473a39ac59c669d7c155c4bcab9b8026eea3431c779cd277e4922d2b9742e1f6678cbe869ec3b5b7ef4132ddb6cdd06cf27dbeb28be72b949fa897610e48e3a0d789fd2eea75abc97b3dc7e00e5c8b3d24e40c6f24112adb72352b89a2bef0599345338e9e76202a3c46efa6370952b2aca41aadbae0ea32531acafcdab6dd066d769ebf50cf4f3c0a59d2d5fa79600a207b9417c623f76ad05e8cccfcd4038f9448bc40f127ca7c0d372e46074e334fe49f5a956ec0056f4da601e6af80eb1a6c4951054869e665b296d8c14f344ca2dc5fdd5df4a3652536365a1615ad9b422165c77bf8fe65a835c8e0c41e070014eb66ef8c525204e990b3a3d663c1e42221b496895c37a2f0c1bf05e91235409c3fe3d89a9a79d6c78609ab18a463311911f71fa37bb73b15fcd38143d1404fd2ce81004dc7ff89cf1115dcc0c35ce1c1bf9941586fb959770f2618ccb7118a7" }, { - "c": "0812276cc788e6870612296d926cba9f0e7b9810670710b5a6e6f1ba006d395774", - "p": "284b9f9199411c6bbf7227eae15cc9fa7ed30534af3ecff85b0d016da329cae1f1edf79f01426434cb90afcc2f0a1fb296e5c51a91b5e57a1f0230fda4f8c5950e7986fa379b99d64b6039a86cc7e35e040ba192b781043959851268ca9874a918805ea958c84f7fee8d3ab4262f032f5a3f840ebcdd273b29be810114e6e86a959d8e4c080572e3ef249edd6ad68503ec3bc4486548520ea2775a41aea67aac99945fce9e7a7769d71f893ad7f0d0108692f6b6852312cae6f9857063055bda59dce521927c70040b8026a41b6517cae0a1c947ca244984a5c0adf7c6483b0939346c48f61cac37d501f46a1c5878b67cee0d0723f4eeadc9f5d71ed5e9f33b4294b58d3ebeefeaa13f20357599be549ce18e6e2eb1d50e1235ccc40ec9184c68a623741a7238ce69aa3a1d25156b3b7eb38fdd6fbe5473979feee3317df279c60d48a289826aa4c76dbce24d526890d4e6e2f83e80f674a1248fc1dc037d982009012ae1133f5e158ae6cdadb18c8d53e4a8ae5595c758782c67aa0c20f146d52085cf45a35794cec45702830f8952a69744718fbe6fe0d3da66e348dd3473a0aced7080fbf5494c3e7e141916f3b135b33277f998fcd9acfbca8709814866e9838a5dcda4c29422cf157293e6fc2ccc2d25423517843bd8e21c61ced72312c0b48814c312021b0d31598d2389b0b329baa1169922a4c34173dd5f540545be5066a0f291f1a870e1aaff94c19f0a855254882a17984baeda08e8ead53d1563e9ee4bc36742789cef4f3ab158054d7ddfe2a2b37b5a8a30be84ff7df9a7d758a9b76751a3622057721a3ec5b873582d0c91cd1febbc153662739854ea15c9903023c193c6b5768b55484108f897cdc47d13a9088b32558e57f12f5807668649c99a17b51905127340e8b49c42775f1b3cab072dfad33d33cc1e4ba5964d728ed0a905" + "c": "09ede20409d5ae0d1c0d3f3d2c68038a384cdd6b7cc5ca2aab670f570adc2dffc3", + "p": "6d86fe00220f8c6ac2ad4e338d80063dba5423af525bd273ecfac8ef6b509192732a8cd0c53d3313e663ac5ccece3d589fd2634e29f96e82b99ca6f8b953645a005d1bc73493f8c41f84fb8e327d4cbe6711dba194a60db30700df94a41e1fda7afe0619169389f8d8ee12bddf736c4bc86cd5b1809a5a27f195209147dc38d0de6f6710ce9350f3b8e7e6820bfe5182e6e58f0b41b82b6ec6bb01ffe1d8b3c2368ebf1e31dfdb9e00f0bc68d9119a38d19c038c29c7b37e31246e7bba56019bc88881d7d695d32557fc0e93635b5f24deffefc787787144e5de7e86281e79934e7e20d9408c34317c778e6b218ee26d0a5e56b8b84a883e3ddf8603826010234531281486454f8c2cf3fee074f242f9fc1da3c6636b86fb6f941eb8b633d6e3b3f87dfe5ae261a40190bd4636f433bcdd5e3400255594e282c5396db8999d95be08a35be9a8f70fdb7cf5353b90584523daee6e27e208b2ca0e5758b8a24b974dca00bab162505a2aa4bcefd8320f111240b62f861261f0ce9b35979f9f92da7dd6989fe1f41ec46049fd514d9142ce23755f52ec7e64df2af33579e9b8356171b91bc96b875511bef6062dd59ef3fe2ddcc152147554405b12c7c5231513405eb062aa8fa093e3414a144c544d551c4f1f9bf5d5d2ff5b50a3f296c800907704bed8d8ee948c0855eff65ad44413af641cdc68a06a7c855be7ed7dd64d5f623bbc9645763d48774ba2258240a83f8f89ef84d21c65bcb75895ebca08b0090b40aafb7ddef039fcaf4bad2dbbac72336c4412c600e854d368ed775597c15d2e66775ab47024ce7e62fd31bf90b183149990c10b5b678501dbac1af8b2897b67d085d87cab7af4036cba3bdcfdcc7548d7710511045813c6818d859e192e03adc0d6a6b30c4cbac20a0d6f8719c7a9c3ad46d62eec464c4c44b58fca463fea3ce1fc51" } ], - "fee": "7000000", + "fee": "23500000", "id": "0436430c-2b02-624c-2032-570501212b00", - "off": "4940f497462b7140383738c1665fa3989e6fff5d9f411a33aa04438f75d6de2c", + "off": "a5a632f26f27a9b71e98c1c8b8098bb41204ffcfd206d995f9c16d10764ad95a", "sigs": [ { "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b6485299a0be2e4306663dcc78f1bc9d029c7be30e423558fe3f4fcfc9ad79a8e", - "xs": "0384a71f13c434e79b70f9a0649e34887f1c6caf3021636cfced448a146ca23c7a" + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841be7bf31d80494f5e4a3d656649b1610c61a268f9cafcfc604b5d9f25efb2aa3c5", + "xs": "02e3c128e436510500616fef3f9a22b15ca015f407c8c5cf96c9059163c873828f" }, { "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b32617ea149fa6faf220f4212530517809e9ed2193f5e558b1de9d339414fda91", + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b04e1e15ceb1b5dbab8baf7750d7bd4aad6cfe97b83e4dc080dae328eb75881fd", "xs": "02e89cce4499ac1e9bb498dab9e3fab93cc40cd3d26c04a0292e00f4bf272499ec" } ], @@ -701,17 +701,17 @@ pub trait OwnerRpc { "id": "0436430c-2b02-624c-2032-570501212b00", "sta": "S3", "off": "750dbf4fd43b7f4cfd68d2698a522f3ff6e6a00ad9895b33f1ec46493b837b49", - "fee": "7000000", + "fee": "23500000", "sigs": [ { "xs": "033bbe2a419ea2e9d6810a8d66552e709d1783ca50759a44dbaf63fc79c0164c4c", "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b35fdfe55271f2ae73d75f58c70d1efb69b3384c7bc507d57e99e56de77e20874" + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b92c7c53280dd79f8b028cd9863bac89820267cac794b121e217541efb061ad53" }, { - "xs": "030152d2d72e2dba7c6086ad49a219d9ff0dfe0fd993dcaea22e058c210033ce93", + "xs": "02b57c1f4fea69a3ee070309cf8f06082022fe06f25a9be1851b56ef0fa18f25d6", "nonce": "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f", - "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841bdad934daa17db7e477c4eed90afed40d1117896df8c4f5861b6309a949878074" + "part": "8f07ddd5e9f5179cff19486034181ed76505baaad53e5d994064127b56c5841b4cd4afef1cd2d708100cd1680d6566e4e987ac5c939ace9c0e036a679121c7a8" } ], "coms": [ @@ -728,8 +728,8 @@ pub trait OwnerRpc { "p": "29701ceae262cac77b79b868c883a292e61e6de8192b868edcd1300b0973d91396b156ace6bd673402a303de10ddd8a5e6b7f17ba6557a574a672bd04cc273ab04ed8e2ca80bac483345c0ec843f521814ce1301ec9adc38956a12b4d948acce71295a4f52bcdeb8a1c9f2d6b2da5d731262a5e9c0276ef904df9ef8d48001420cd59f75a2f1ae5c7a1c7c6b9f140e7613e52ef9e249f29f9340b7efb80699e460164324616f98fd4cde3db52497c919e95222fffeacb7e65deca7e368a80ce713c19de7da5369726228ee336f5bd494538c12ccbffeb1b9bfd5fc8906d1c64245b516f103fa96d9c56975837652c1e0fa5803d7ccf1147d8f927e36da717f7ad79471dbe192f5f50f87a79fc3fe030dba569b634b92d2cf307993cce545633af263897cd7e6ebf4dcafb176d07358bdc38d03e45a49dfa9c8c6517cd68d167ffbf6c3b4de0e2dd21909cbad4c467b84e5700be473a39ac59c669d7c155c4bcab9b8026eea3431c779cd277e4922d2b9742e1f6678cbe869ec3b5b7ef4132ddb6cdd06cf27dbeb28be72b949fa897610e48e3a0d789fd2eea75abc97b3dc7e00e5c8b3d24e40c6f24112adb72352b89a2bef0599345338e9e76202a3c46efa6370952b2aca41aadbae0ea32531acafcdab6dd066d769ebf50cf4f3c0a59d2d5fa79600a207b9417c623f76ad05e8cccfcd4038f9448bc40f127ca7c0d372e46074e334fe49f5a956ec0056f4da601e6af80eb1a6c4951054869e665b296d8c14f344ca2dc5fdd5df4a3652536365a1615ad9b422165c77bf8fe65a835c8e0c41e070014eb66ef8c525204e990b3a3d663c1e42221b496895c37a2f0c1bf05e91235409c3fe3d89a9a79d6c78609ab18a463311911f71fa37bb73b15fcd38143d1404fd2ce81004dc7ff89cf1115dcc0c35ce1c1bf9941586fb959770f2618ccb7118a7" }, { - "c": "0812276cc788e6870612296d926cba9f0e7b9810670710b5a6e6f1ba006d395774", - "p": "284b9f9199411c6bbf7227eae15cc9fa7ed30534af3ecff85b0d016da329cae1f1edf79f01426434cb90afcc2f0a1fb296e5c51a91b5e57a1f0230fda4f8c5950e7986fa379b99d64b6039a86cc7e35e040ba192b781043959851268ca9874a918805ea958c84f7fee8d3ab4262f032f5a3f840ebcdd273b29be810114e6e86a959d8e4c080572e3ef249edd6ad68503ec3bc4486548520ea2775a41aea67aac99945fce9e7a7769d71f893ad7f0d0108692f6b6852312cae6f9857063055bda59dce521927c70040b8026a41b6517cae0a1c947ca244984a5c0adf7c6483b0939346c48f61cac37d501f46a1c5878b67cee0d0723f4eeadc9f5d71ed5e9f33b4294b58d3ebeefeaa13f20357599be549ce18e6e2eb1d50e1235ccc40ec9184c68a623741a7238ce69aa3a1d25156b3b7eb38fdd6fbe5473979feee3317df279c60d48a289826aa4c76dbce24d526890d4e6e2f83e80f674a1248fc1dc037d982009012ae1133f5e158ae6cdadb18c8d53e4a8ae5595c758782c67aa0c20f146d52085cf45a35794cec45702830f8952a69744718fbe6fe0d3da66e348dd3473a0aced7080fbf5494c3e7e141916f3b135b33277f998fcd9acfbca8709814866e9838a5dcda4c29422cf157293e6fc2ccc2d25423517843bd8e21c61ced72312c0b48814c312021b0d31598d2389b0b329baa1169922a4c34173dd5f540545be5066a0f291f1a870e1aaff94c19f0a855254882a17984baeda08e8ead53d1563e9ee4bc36742789cef4f3ab158054d7ddfe2a2b37b5a8a30be84ff7df9a7d758a9b76751a3622057721a3ec5b873582d0c91cd1febbc153662739854ea15c9903023c193c6b5768b55484108f897cdc47d13a9088b32558e57f12f5807668649c99a17b51905127340e8b49c42775f1b3cab072dfad33d33cc1e4ba5964d728ed0a905" + "c": "09ede20409d5ae0d1c0d3f3d2c68038a384cdd6b7cc5ca2aab670f570adc2dffc3", + "p": "6d86fe00220f8c6ac2ad4e338d80063dba5423af525bd273ecfac8ef6b509192732a8cd0c53d3313e663ac5ccece3d589fd2634e29f96e82b99ca6f8b953645a005d1bc73493f8c41f84fb8e327d4cbe6711dba194a60db30700df94a41e1fda7afe0619169389f8d8ee12bddf736c4bc86cd5b1809a5a27f195209147dc38d0de6f6710ce9350f3b8e7e6820bfe5182e6e58f0b41b82b6ec6bb01ffe1d8b3c2368ebf1e31dfdb9e00f0bc68d9119a38d19c038c29c7b37e31246e7bba56019bc88881d7d695d32557fc0e93635b5f24deffefc787787144e5de7e86281e79934e7e20d9408c34317c778e6b218ee26d0a5e56b8b84a883e3ddf8603826010234531281486454f8c2cf3fee074f242f9fc1da3c6636b86fb6f941eb8b633d6e3b3f87dfe5ae261a40190bd4636f433bcdd5e3400255594e282c5396db8999d95be08a35be9a8f70fdb7cf5353b90584523daee6e27e208b2ca0e5758b8a24b974dca00bab162505a2aa4bcefd8320f111240b62f861261f0ce9b35979f9f92da7dd6989fe1f41ec46049fd514d9142ce23755f52ec7e64df2af33579e9b8356171b91bc96b875511bef6062dd59ef3fe2ddcc152147554405b12c7c5231513405eb062aa8fa093e3414a144c544d551c4f1f9bf5d5d2ff5b50a3f296c800907704bed8d8ee948c0855eff65ad44413af641cdc68a06a7c855be7ed7dd64d5f623bbc9645763d48774ba2258240a83f8f89ef84d21c65bcb75895ebca08b0090b40aafb7ddef039fcaf4bad2dbbac72336c4412c600e854d368ed775597c15d2e66775ab47024ce7e62fd31bf90b183149990c10b5b678501dbac1af8b2897b67d085d87cab7af4036cba3bdcfdcc7548d7710511045813c6818d859e192e03adc0d6a6b30c4cbac20a0d6f8719c7a9c3ad46d62eec464c4c44b58fca463fea3ce1fc51" } ] }, @@ -821,7 +821,7 @@ pub trait OwnerRpc { "p": "29701ceae262cac77b79b868c883a292e61e6de8192b868edcd1300b0973d91396b156ace6bd673402a303de10ddd8a5e6b7f17ba6557a574a672bd04cc273ab04ed8e2ca80bac483345c0ec843f521814ce1301ec9adc38956a12b4d948acce71295a4f52bcdeb8a1c9f2d6b2da5d731262a5e9c0276ef904df9ef8d48001420cd59f75a2f1ae5c7a1c7c6b9f140e7613e52ef9e249f29f9340b7efb80699e460164324616f98fd4cde3db52497c919e95222fffeacb7e65deca7e368a80ce713c19de7da5369726228ee336f5bd494538c12ccbffeb1b9bfd5fc8906d1c64245b516f103fa96d9c56975837652c1e0fa5803d7ccf1147d8f927e36da717f7ad79471dbe192f5f50f87a79fc3fe030dba569b634b92d2cf307993cce545633af263897cd7e6ebf4dcafb176d07358bdc38d03e45a49dfa9c8c6517cd68d167ffbf6c3b4de0e2dd21909cbad4c467b84e5700be473a39ac59c669d7c155c4bcab9b8026eea3431c779cd277e4922d2b9742e1f6678cbe869ec3b5b7ef4132ddb6cdd06cf27dbeb28be72b949fa897610e48e3a0d789fd2eea75abc97b3dc7e00e5c8b3d24e40c6f24112adb72352b89a2bef0599345338e9e76202a3c46efa6370952b2aca41aadbae0ea32531acafcdab6dd066d769ebf50cf4f3c0a59d2d5fa79600a207b9417c623f76ad05e8cccfcd4038f9448bc40f127ca7c0d372e46074e334fe49f5a956ec0056f4da601e6af80eb1a6c4951054869e665b296d8c14f344ca2dc5fdd5df4a3652536365a1615ad9b422165c77bf8fe65a835c8e0c41e070014eb66ef8c525204e990b3a3d663c1e42221b496895c37a2f0c1bf05e91235409c3fe3d89a9a79d6c78609ab18a463311911f71fa37bb73b15fcd38143d1404fd2ce81004dc7ff89cf1115dcc0c35ce1c1bf9941586fb959770f2618ccb7118a7" } ], - "fee": "7000000", + "fee": "23500000", "id": "0436430c-2b02-624c-2032-570501212b00", "sigs": [], "sta": "S3", diff --git a/config/src/comments.rs b/config/src/comments.rs index a7b19bb29..02676d31c 100644 --- a/config/src/comments.rs +++ b/config/src/comments.rs @@ -122,7 +122,13 @@ fn comments() -> HashMap { " .to_string(), ); - + retval.insert( + "accept_fee_base".to_string(), + " +#Minimum acceptable fee per unit of transaction weight +" + .to_string(), + ); retval.insert( "[logging]".to_string(), " diff --git a/config/src/types.rs b/config/src/types.rs index 7dc4a314e..036134c7c 100644 --- a/config/src/types.rs +++ b/config/src/types.rs @@ -53,6 +53,9 @@ pub struct WalletConfig { pub dark_background_color_scheme: Option, /// The exploding lifetime (minutes) for keybase notification on coins received pub keybase_notify_ttl: Option, + /// Scaling factor from transaction weight to transaction fee + /// should match accept_fee_base parameter in grin-server + pub accept_fee_base: Option, } impl Default for WalletConfig { @@ -71,6 +74,7 @@ impl Default for WalletConfig { tls_certificate_key: None, dark_background_color_scheme: Some(true), keybase_notify_ttl: Some(1440), + accept_fee_base: None, } } } @@ -86,6 +90,11 @@ impl WalletConfig { 3420 } + /// Default listener port + pub fn default_accept_fee_base() -> u64 { + 500_000 + } + /// Use value from config file, defaulting to sensible value if missing. pub fn owner_api_listen_port(&self) -> u16 { self.owner_api_listen_port @@ -96,6 +105,12 @@ impl WalletConfig { pub fn owner_api_listen_addr(&self) -> String { format!("127.0.0.1:{}", self.owner_api_listen_port()) } + + /// Accept fee base + pub fn accept_fee_base(&self) -> u64 { + self.accept_fee_base + .unwrap_or_else(|| WalletConfig::default_accept_fee_base()) + } } /// Error type wrapping config errors. #[derive(Debug)] diff --git a/controller/src/command.rs b/controller/src/command.rs index 77cd9c6d3..82ee94c07 100644 --- a/controller/src/command.rs +++ b/controller/src/command.rs @@ -17,6 +17,7 @@ use crate::api::TLSConfig; use crate::apiwallet::{try_slatepack_sync_workflow, Owner}; use crate::config::{TorConfig, WalletConfig, WALLET_CONFIG_FILE_NAME}; +use crate::core::core::FeeFields; use crate::core::{core, global}; use crate::error::{Error, ErrorKind}; use crate::impls::PathToSlatepack; @@ -277,7 +278,7 @@ where let mut slate = Slate::blank(2, false); controller::owner_single_use(None, keychain_mask, Some(owner_api), |api, m| { if args.estimate_selection_strategies { - let strategies = vec!["smallest", "all"] + let strategies: Vec<(&str, u64, FeeFields)> = vec!["smallest", "all"] .into_iter() .map(|strategy| { let init_args = InitTxArgs { @@ -291,7 +292,7 @@ where ..Default::default() }; let slate = api.init_send_tx(m, init_args).unwrap(); - (strategy, slate.amount, slate.fee) + (strategy, slate.amount, slate.fee_fields) }) .collect(); display::estimate(args.amount, strategies, dark_scheme); @@ -848,7 +849,7 @@ where ..Default::default() }; let slate = api.init_send_tx(m, init_args).unwrap(); - (strategy, slate.amount, slate.fee) + (strategy, slate.amount, slate.fee_fields) }) .collect(); display::estimate(slate.amount, strategies, dark_scheme); diff --git a/controller/src/display.rs b/controller/src/display.rs index bff4cd976..a64705482 100644 --- a/controller/src/display.rs +++ b/controller/src/display.rs @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::core::consensus::YEAR_HEIGHT; +use crate::core::core::FeeFields; use crate::core::core::{self, amount_to_hr_string}; use crate::core::global; use crate::libwallet::{ @@ -189,7 +191,7 @@ pub fn txs( let amount_debited_str = core::amount_to_hr_string(t.amount_debited, true); let amount_credited_str = core::amount_to_hr_string(t.amount_credited, true); let fee = match t.fee { - Some(f) => format!("{}", core::amount_to_hr_string(f, true)), + Some(f) => format!("{}", core::amount_to_hr_string(f.fee(cur_height), true)), None => "None".to_owned(), }; let net_diff = if t.amount_credited >= t.amount_debited { @@ -393,9 +395,9 @@ pub fn info( pub fn estimate( amount: u64, strategies: Vec<( - &str, // strategy - u64, // total amount to be locked - u64, // fee + &str, // strategy + u64, // total amount to be locked + FeeFields, // fee )>, dark_background_color_scheme: bool, ) { @@ -412,17 +414,17 @@ pub fn estimate( bMG->"Will be locked", ]); - for (strategy, total, fee) in strategies { + for (strategy, total, fee_fields) in strategies { if dark_background_color_scheme { table.add_row(row![ bFC->strategy, - FR->amount_to_hr_string(fee, false), + FR->amount_to_hr_string(fee_fields.fee(2*YEAR_HEIGHT), false), // apply fee mask past HF4 FY->amount_to_hr_string(total, false), ]); } else { table.add_row(row![ bFD->strategy, - FR->amount_to_hr_string(fee, false), + FR->amount_to_hr_string(fee_fields.fee(2*YEAR_HEIGHT), false), // apply fee mask past HF4 FY->amount_to_hr_string(total, false), ]); } @@ -484,7 +486,7 @@ pub fn payment_proof(tx: &TxLogEntry) -> Result<(), Error> { None => "None".to_owned(), }; let fee = match tx.fee { - Some(f) => f, + Some(f) => f.fee(2 * YEAR_HEIGHT), // apply fee mask past HF4 None => 0, }; let amount = if tx.amount_credited >= tx.amount_debited { diff --git a/controller/tests/no_change.rs b/controller/tests/no_change.rs index ef3970c97..0a3bc2776 100644 --- a/controller/tests/no_change.rs +++ b/controller/tests/no_change.rs @@ -73,7 +73,7 @@ fn no_change_test_impl(test_dir: &'static str) -> Result<(), libwallet::Error> { // Mine into wallet 1 let _ = test_framework::award_blocks_to_wallet(&chain, wallet1.clone(), mask1, 4, false); - let fee = core::libtx::tx_fee(1, 1, 1, None); + let fee = core::libtx::tx_fee(1, 1, 1); // send a single block's worth of transactions with minimal strategy let mut slate = Slate::blank(2, false); diff --git a/controller/tests/transaction.rs b/controller/tests/transaction.rs index 2f19ffef6..e122e7169 100644 --- a/controller/tests/transaction.rs +++ b/controller/tests/transaction.rs @@ -24,6 +24,7 @@ use self::core::core::transaction; use self::core::global; use self::libwallet::{InitTxArgs, OutputStatus, Slate, SlateState}; use impls::test_framework::{self, LocalWalletClient}; +use std::convert::TryInto; use std::sync::atomic::Ordering; use std::thread; use std::time::Duration; @@ -124,6 +125,7 @@ fn basic_transaction_api(test_dir: &'static str) -> Result<(), libwallet::Error> assert_eq!(slate.state, SlateState::Standard3); // Check we have a single kernel and that it is a Plain kernel (no lock_height). + // fees for 7 inputs, 2 outputs, 1 kernel (weight 52) assert_eq!(slate.tx_or_err()?.kernels().len(), 1); assert_eq!( slate @@ -132,7 +134,9 @@ fn basic_transaction_api(test_dir: &'static str) -> Result<(), libwallet::Error> .first() .map(|k| k.features) .unwrap(), - transaction::KernelFeatures::Plain { fee: 2000000 } + transaction::KernelFeatures::Plain { + fee: 26_000_000.into() + } ); Ok(()) @@ -147,7 +151,6 @@ fn basic_transaction_api(test_dir: &'static str) -> Result<(), libwallet::Error> wallet1_info.last_confirmed_height as usize - cm as usize, 2, 1, - None, ); // we should have a transaction entry for this slate let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id)); @@ -157,7 +160,7 @@ fn basic_transaction_api(test_dir: &'static str) -> Result<(), libwallet::Error> assert!(tx.confirmation_ts.is_none()); assert_eq!(tx.amount_debited - tx.amount_credited, fee + amount); println!("tx: {:?}", tx); - assert_eq!(Some(fee), tx.fee); + assert_eq!(Some(fee.try_into().unwrap()), tx.fee); Ok(()) })?; @@ -194,7 +197,6 @@ fn basic_transaction_api(test_dir: &'static str) -> Result<(), libwallet::Error> wallet1_info.last_confirmed_height as usize - 1 - cm as usize, 2, 1, - None, ); assert!(wallet1_refreshed); // wallet 1 received fees, so amount should be the same @@ -269,7 +271,8 @@ fn basic_transaction_api(test_dir: &'static str) -> Result<(), libwallet::Error> }; let est = sender_api.init_send_tx(m, init_args)?; assert_eq!(est.amount, 600_000_000_000); - assert_eq!(est.fee, 4_000_000); + // fees for 5 inputs, 2 outputs, 1 kernel (weight 50) + assert_eq!(est.fee_fields.fee(0), 25_000_000); let init_args = InitTxArgs { src_acct_name: None, @@ -283,7 +286,8 @@ fn basic_transaction_api(test_dir: &'static str) -> Result<(), libwallet::Error> }; let est = sender_api.init_send_tx(m, init_args)?; assert_eq!(est.amount, 180_000_000_000); - assert_eq!(est.fee, 6_000_000); + // fees for 3 inputs, 2 outputs, 1 kernel (weight 48) + assert_eq!(est.fee_fields.fee(0), 24_000_000); Ok(()) })?; diff --git a/impls/src/node_clients/http.rs b/impls/src/node_clients/http.rs index 585c6438a..5c6e226a0 100644 --- a/impls/src/node_clients/http.rs +++ b/impls/src/node_clients/http.rs @@ -388,7 +388,7 @@ mod tests { let key_id1 = ExtKeychain::derive_key_id(1, 1, 0, 0, 0); let key_id2 = ExtKeychain::derive_key_id(1, 2, 0, 0, 0); let tx = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[build::input(5, key_id1), build::output(3, key_id2)], &keychain, &builder, diff --git a/impls/src/test_framework/mod.rs b/impls/src/test_framework/mod.rs index 4dd921b24..e7aa16688 100644 --- a/impls/src/test_framework/mod.rs +++ b/impls/src/test_framework/mod.rs @@ -107,7 +107,8 @@ fn create_block_with_reward( reward_output: Output, reward_kernel: TxKernel, ) -> core::core::Block { - let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); + let next_header_info = + consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); let mut b = core::core::Block::new( &prev, txs, @@ -155,7 +156,7 @@ where K: keychain::Keychain + 'a, { // build block fees - let fee_amt = txs.iter().map(|tx| tx.fee()).sum(); + let fee_amt = txs.iter().map(|tx| tx.fee(prev.height + 1)).sum(); let block_fees = BlockFees { fees: fee_amt, key_id: None, diff --git a/libwallet/src/api_impl/foreign.rs b/libwallet/src/api_impl/foreign.rs index 99f17ba4f..6f868436c 100644 --- a/libwallet/src/api_impl/foreign.rs +++ b/libwallet/src/api_impl/foreign.rs @@ -17,6 +17,7 @@ use strum::IntoEnumIterator; use crate::api_impl::owner::finalize_tx as owner_finalize; use crate::api_impl::owner::{check_ttl, post_tx}; +use crate::grin_core::core::FeeFields; use crate::grin_keychain::Keychain; use crate::grin_util::secp::key::SecretKey; use crate::internal::{selection, tx, updater}; @@ -122,7 +123,7 @@ where } ret_slate.amount = 0; - ret_slate.fee = 0; + ret_slate.fee_fields = FeeFields::zero(); ret_slate.remove_other_sigdata(&keychain, &context.sec_nonce, &context.sec_key)?; ret_slate.state = SlateState::Standard2; diff --git a/libwallet/src/api_impl/owner.rs b/libwallet/src/api_impl/owner.rs index 7edeef7cf..282591c97 100644 --- a/libwallet/src/api_impl/owner.rs +++ b/libwallet/src/api_impl/owner.rs @@ -16,6 +16,7 @@ use uuid::Uuid; +use crate::grin_core::consensus::YEAR_HEIGHT; use crate::grin_core::core::hash::Hashed; use crate::grin_core::core::Transaction; use crate::grin_util::secp::key::SecretKey; @@ -37,7 +38,7 @@ use ed25519_dalek::PublicKey as DalekPublicKey; use ed25519_dalek::SecretKey as DalekSecretKey; use ed25519_dalek::Verifier; -use std::convert::TryFrom; +use std::convert::{TryFrom, TryInto}; use std::sync::mpsc::Sender; use std::sync::Arc; @@ -403,7 +404,7 @@ where tx.amount_credited - tx.amount_debited } else { let fee = match tx.fee { - Some(f) => f, + Some(f) => f.fee(2 * YEAR_HEIGHT), // apply fee mask past HF4 None => 0, }; tx.amount_debited - tx.amount_credited - fee @@ -495,7 +496,7 @@ where &parent_key_id, )?; slate.amount = total; - slate.fee = fee; + slate.fee_fields = fee.try_into().unwrap(); return Ok(slate); } @@ -799,7 +800,7 @@ where args.max_outputs as usize, args.num_change_outputs as usize, args.selection_strategy_is_use_all, - Some(context.fee), + Some(context.fee.map(|f| f.fee(current_height)).unwrap_or(0)), parent_key_id.clone(), false, true, @@ -869,6 +870,7 @@ where } /// get stored tx +/// crashes if stored tx has total fees exceeding 2^40 nanogrin pub fn get_stored_tx<'a, T: ?Sized, C, K>( w: &T, tx_id: Option, @@ -905,7 +907,7 @@ where Some(tx) => { let mut slate = Slate::blank(2, false); slate.tx = Some(tx.clone()); - slate.fee = tx.fee(); + slate.fee_fields = tx.aggregate_fee_fields(0).unwrap(); slate.id = id.clone(); slate.offset = tx.offset; slate.state = SlateState::Standard3; diff --git a/libwallet/src/internal/selection.rs b/libwallet/src/internal/selection.rs index 8fa95c1fd..d246e1c48 100644 --- a/libwallet/src/internal/selection.rs +++ b/libwallet/src/internal/selection.rs @@ -30,6 +30,7 @@ use crate::slate::Slate; use crate::types::*; use crate::util::OnionV3Address; use std::collections::HashMap; +use std::convert::TryInto; /// Initialize a transaction on the sender side, returns a corresponding /// libwallet transaction slate with the appropriate inputs selected, @@ -74,7 +75,7 @@ where } // Update the fee on the slate so we account for this when building the tx. - slate.fee = fee; + slate.fee_fields = fee.try_into().unwrap(); slate.add_transaction_elements(keychain, &ProofBuilder::new(keychain), elems)?; // Create our own private context @@ -85,7 +86,7 @@ where is_initiator, ); - context.fee = fee; + context.fee = Some(slate.fee_fields); context.amount = slate.amount; // Store our private identifiers for each input @@ -151,7 +152,7 @@ where t.tx_slate_id = Some(slate_id); let filename = format!("{}.grintx", slate_id); t.stored_tx = Some(filename); - t.fee = Some(context.fee); + t.fee = context.fee; t.ttl_cutoff_height = match slate.ttl_cutoff_height { 0 => None, n => Some(n), @@ -268,7 +269,7 @@ where context.add_output(&key_id, &None, amount); context.amount = amount; - context.fee = slate.fee; + context.fee = slate.fee_fields.as_opt(); let commit = wallet.calc_commit_for_cache(keychain_mask, amount, &key_id_inner)?; let mut batch = wallet.batch(keychain_mask)?; let log_id = batch.next_tx_log_id(&parent_key_id)?; @@ -398,7 +399,7 @@ where // sender // First attempt to spend without change - let mut fee = tx_fee(coins.len(), 1, 1, None); + let mut fee = tx_fee(coins.len(), 1, 1); let mut total: u64 = coins.iter().map(|c| c.value).sum(); let mut amount_with_fee = amount + fee; @@ -427,7 +428,7 @@ where // We need to add a change address or amount with fee is more than total if total != amount_with_fee { - fee = tx_fee(coins.len(), num_outputs, 1, None); + fee = tx_fee(coins.len(), num_outputs, 1); amount_with_fee = amount + fee; // Here check if we have enough outputs for the amount including fee otherwise @@ -455,7 +456,7 @@ where parent_key_id, ) .1; - fee = tx_fee(coins.len(), num_outputs, 1, None); + fee = tx_fee(coins.len(), num_outputs, 1); total = coins.iter().map(|c| c.value).sum(); amount_with_fee = amount + fee; } @@ -655,7 +656,9 @@ where // restore the original amount, fee slate.amount = context.amount; if update_fee { - slate.fee = context.fee; + slate.fee_fields = context + .fee + .ok_or_else(|| ErrorKind::Fee("Missing fee fields".into()))?; } let keychain = wallet.keychain(keychain_mask)?; diff --git a/libwallet/src/internal/tx.rs b/libwallet/src/internal/tx.rs index f4cc37a5b..fe8968b72 100644 --- a/libwallet/src/internal/tx.rs +++ b/libwallet/src/internal/tx.rs @@ -35,6 +35,7 @@ use ed25519_dalek::PublicKey as DalekPublicKey; use ed25519_dalek::SecretKey as DalekSecretKey; use ed25519_dalek::Signature as DalekSignature; use ed25519_dalek::{Signer, Verifier}; +use grin_wallet_util::grin_core::core::FeeFields; // static for incrementing test UUIDs lazy_static! { @@ -276,13 +277,13 @@ where init_tx_args.selection_strategy_is_use_all, &parent_key_id, )?; - slate.fee = fee; + slate.fee_fields = FeeFields::new(0, fee)?; let keychain = wallet.keychain(keychain_mask)?; // Create our own private context let mut context = Context::new(keychain.secp(), &parent_key_id, use_test_rng, true); - context.fee = slate.fee; + context.fee = Some(slate.fee_fields); context.amount = slate.amount; context.late_lock_args = Some(init_tx_args.clone()); @@ -585,7 +586,7 @@ mod test { use super::*; use rand::rngs::mock::StepRng; - use crate::grin_core::core::KernelFeatures; + use crate::grin_core::core::{FeeFields, KernelFeatures}; use crate::grin_core::libtx::{build, ProofBuilder}; use crate::grin_keychain::{ BlindSum, BlindingFactor, ExtKeychain, ExtKeychainPath, Keychain, SwitchCommitmentType, @@ -601,14 +602,18 @@ mod test { let key_id1 = ExtKeychainPath::new(1, 1, 0, 0, 0).to_identifier(); let tx1 = build::transaction( - KernelFeatures::Plain { fee: 0 }, + KernelFeatures::Plain { + fee: FeeFields::zero(), + }, &[build::output(105, key_id1.clone())], &keychain, &builder, ) .unwrap(); let tx2 = build::transaction( - KernelFeatures::Plain { fee: 0 }, + KernelFeatures::Plain { + fee: FeeFields::zero(), + }, &[build::input(105, key_id1.clone())], &keychain, &builder, diff --git a/libwallet/src/slate.rs b/libwallet/src/slate.rs index 5cc51a37b..84856da6c 100644 --- a/libwallet/src/slate.rs +++ b/libwallet/src/slate.rs @@ -16,10 +16,11 @@ //! around during an interactive wallet exchange use crate::error::{Error, ErrorKind}; +use crate::grin_core::consensus::YEAR_HEIGHT; use crate::grin_core::core::amount_to_hr_string; use crate::grin_core::core::transaction::{ - Input, Inputs, KernelFeatures, NRDRelativeHeight, Output, OutputFeatures, Transaction, - TxKernel, Weighting, + FeeFields, Input, Inputs, KernelFeatures, NRDRelativeHeight, Output, OutputFeatures, + Transaction, TxKernel, Weighting, }; use crate::grin_core::core::verifier_cache::LruVerifierCache; use crate::grin_core::libtx::{aggsig, build, proof::ProofBuild, tx_fee}; @@ -105,8 +106,8 @@ pub struct Slate { pub tx: Option, /// base amount (excluding fee) pub amount: u64, - /// fee amount - pub fee: u64, + /// fee amount and shift + pub fee_fields: FeeFields, /// TTL, the block height at which wallets /// should refuse to process the transaction and unlock all /// associated outputs @@ -265,7 +266,7 @@ impl Slate { state, tx: Some(Slate::empty_transaction()), amount: 0, - fee: 0, + fee_fields: FeeFields::zero(), ttl_cutoff_height: 0, kernel_features: 0, offset: BlindingFactor::zero(), @@ -351,10 +352,12 @@ impl Slate { // Any other value is invalid. fn kernel_features(&self) -> Result { match self.kernel_features { - 0 => Ok(KernelFeatures::Plain { fee: self.fee }), + 0 => Ok(KernelFeatures::Plain { + fee: self.fee_fields, + }), 1 => Err(ErrorKind::InvalidKernelFeatures(1).into()), 2 => Ok(KernelFeatures::HeightLocked { - fee: self.fee, + fee: self.fee_fields, lock_height: match &self.kernel_features_args { Some(a) => a.lock_height, None => { @@ -363,7 +366,7 @@ impl Slate { }, }), 3 => Ok(KernelFeatures::NoRecentDuplicate { - fee: self.fee, + fee: self.fee_fields, relative_height: match &self.kernel_features_args { Some(a) => NRDRelativeHeight::new(a.lock_height)?, None => { @@ -549,24 +552,23 @@ impl Slate { // double check the fee amount included in the partial tx // we don't necessarily want to just trust the sender // we could just overwrite the fee here (but we won't) due to the sig - let fee = tx_fee( - tx.inputs().len(), - tx.outputs().len(), - tx.kernels().len(), - None, - ); - - if fee > tx.fee() { - return Err( - ErrorKind::Fee(format!("Fee Dispute Error: {}, {}", tx.fee(), fee,)).into(), - ); + let fee = tx_fee(tx.inputs().len(), tx.outputs().len(), tx.kernels().len()); + + if fee > tx.fee(2 * YEAR_HEIGHT) { + // apply fee mask past HF4 + return Err(ErrorKind::Fee(format!( + "Fee Dispute Error: {}, {}", + tx.fee(2 * YEAR_HEIGHT), + fee, + )) + .into()); } - if fee > self.amount + self.fee { + if fee > self.amount + self.fee_fields.fee(2 * YEAR_HEIGHT) { let reason = format!( "Rejected the transfer because transaction fee ({}) exceeds received amount ({}).", amount_to_hr_string(fee, false), - amount_to_hr_string(self.amount + self.fee, false) + amount_to_hr_string(self.amount + self.fee_fields.fee(2 * YEAR_HEIGHT), false) ); info!("{}", reason); return Err(ErrorKind::Fee(reason).into()); @@ -676,7 +678,7 @@ impl Slate { // confirm the overall transaction is valid (including the updated kernel) // accounting for tx weight limits let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); - if let Err(e) = final_tx.validate(Weighting::AsTransaction, verifier_cache) { + if let Err(e) = final_tx.validate(Weighting::AsTransaction, verifier_cache, 0) { error!("Error with final tx validation: {}", e); Err(e.into()) } else { @@ -708,7 +710,7 @@ impl From for SlateV4 { state, tx: _, amount, - fee, + fee_fields, kernel_features, ttl_cutoff_height: ttl, offset: off, @@ -734,7 +736,7 @@ impl From for SlateV4 { sta, coms: (&slate).into(), amt: amount, - fee, + fee: fee_fields, feat: kernel_features, ttl, off, @@ -754,7 +756,7 @@ impl From<&Slate> for SlateV4 { state, tx: _, amount, - fee, + fee_fields, kernel_features, ttl_cutoff_height: ttl, offset, @@ -766,7 +768,7 @@ impl From<&Slate> for SlateV4 { let num_parts = *num_parts; let id = *id; let amount = *amount; - let fee = *fee; + let fee_fields = *fee_fields; let feat = *kernel_features; let ttl = *ttl; let off = offset.clone(); @@ -787,7 +789,7 @@ impl From<&Slate> for SlateV4 { sta, coms: slate.into(), amt: amount, - fee, + fee: fee_fields, feat, ttl, off, @@ -914,7 +916,7 @@ impl From for Slate { sta, coms: _, amt: amount, - fee, + fee: fee_fields, feat: kernel_features, ttl: ttl_cutoff_height, off: offset, @@ -940,7 +942,7 @@ impl From for Slate { state, tx: (&slate).into(), amount, - fee, + fee_fields, kernel_features, ttl_cutoff_height, offset, @@ -960,7 +962,7 @@ pub fn tx_from_slate_v4(slate: &SlateV4) -> Option { let secp = static_secp_instance(); let secp = secp.lock(); let mut calc_slate = Slate::blank(2, false); - calc_slate.fee = slate.fee; + calc_slate.fee_fields = slate.fee; for d in slate.sigs.iter() { calc_slate.participant_data.push(ParticipantData { public_blind_excess: d.xs, diff --git a/libwallet/src/slate_versions/v4.rs b/libwallet/src/slate_versions/v4.rs index 0b09a629c..3ce4f2816 100644 --- a/libwallet/src/slate_versions/v4.rs +++ b/libwallet/src/slate_versions/v4.rs @@ -53,6 +53,7 @@ //! * The `receiver_signature` field is renamed to `rsig` //! * `rsig` may be omitted if it has not yet been filled out +use crate::grin_core::core::FeeFields; use crate::grin_core::core::{Input, Output, TxKernel}; use crate::grin_core::libtx::secp_ser; use crate::grin_keychain::{BlindingFactor, Identifier}; @@ -95,11 +96,10 @@ pub struct SlateV4 { #[serde(skip_serializing_if = "u64_is_blank")] #[serde(default = "default_u64_0")] pub amt: u64, - /// fee amount - #[serde(with = "secp_ser::string_or_u64")] - #[serde(default = "default_u64")] - #[serde(skip_serializing_if = "u64_is_blank")] - pub fee: u64, + /// fee + #[serde(skip_serializing_if = "fee_is_zero")] + #[serde(default = "default_fee")] + pub fee: FeeFields, /// kernel features, if any #[serde(skip_serializing_if = "u8_is_blank")] #[serde(default = "default_u8_0")] @@ -297,10 +297,6 @@ fn default_range_proof() -> Option { None } -fn default_u64() -> u64 { - 0 -} - fn u64_is_blank(u: &u64) -> bool { *u == 0 } @@ -312,6 +308,15 @@ fn default_u8_0() -> u8 { fn u8_is_blank(u: &u8) -> bool { *u == 0 } + +fn fee_is_zero(f: &FeeFields) -> bool { + f.is_zero() +} + +fn default_fee() -> FeeFields { + FeeFields::zero() +} + /// A mining node requests new coinbase via the foreign api every time a new candidate block is built. #[derive(Serialize, Deserialize, Debug, Clone)] pub struct CoinbaseV4 { diff --git a/libwallet/src/slate_versions/v4_bin.rs b/libwallet/src/slate_versions/v4_bin.rs index 379401d37..d86b9697e 100644 --- a/libwallet/src/slate_versions/v4_bin.rs +++ b/libwallet/src/slate_versions/v4_bin.rs @@ -14,7 +14,8 @@ //! Wraps a V4 Slate into a V4 Binary slate -use crate::grin_core::core::transaction::OutputFeatures; +use crate::grin_core::consensus::YEAR_HEIGHT; +use crate::grin_core::core::transaction::{FeeFields, OutputFeatures}; use crate::grin_core::ser as grin_ser; use crate::grin_core::ser::{Readable, Reader, Writeable, Writer}; use crate::grin_keychain::BlindingFactor; @@ -87,8 +88,8 @@ struct SlateOptFields { pub num_parts: u8, /// amt, default 0 pub amt: u64, - /// fee, default 0 - pub fee: u64, + /// fee_fields, default FeeFields::zero() + pub fee: FeeFields, /// kernel features, default 0 pub feat: u8, /// ttl, default 0 @@ -107,7 +108,8 @@ impl Writeable for SlateOptFields { if self.amt > 0 { status |= 0x02; } - if self.fee > 0 { + if self.fee.fee(2 * YEAR_HEIGHT) > 0 { + // apply fee mask past HF4 status |= 0x04; } if self.feat > 0 { @@ -124,7 +126,7 @@ impl Writeable for SlateOptFields { writer.write_u64(self.amt)?; } if status & 0x04 > 0 { - writer.write_u64(self.fee)?; + self.fee.write(writer)?; } if status & 0x08 > 0 { writer.write_u8(self.feat)?; @@ -150,9 +152,9 @@ impl Readable for SlateOptFields { 0 }; let fee = if status & 0x04 > 0 { - reader.read_u64()? + FeeFields::read(reader)? } else { - 0 + FeeFields::zero() }; let feat = if status & 0x08 > 0 { reader.read_u8()? @@ -488,7 +490,9 @@ fn slate_v4_serialize_deserialize() { use crate::grin_util::from_hex; use crate::grin_util::secp::key::PublicKey; use crate::Slate; + use grin_wallet_util::grin_core::global::{set_local_chain_type, ChainTypes}; use grin_wallet_util::grin_keychain::{ExtKeychain, Keychain, SwitchCommitmentType}; + set_local_chain_type(ChainTypes::Mainnet); let slate = Slate::blank(1, false); let mut v4 = SlateV4::from(slate); diff --git a/libwallet/src/types.rs b/libwallet/src/types.rs index 27fa71268..bef865c71 100644 --- a/libwallet/src/types.rs +++ b/libwallet/src/types.rs @@ -18,6 +18,7 @@ use crate::config::{TorConfig, WalletConfig}; use crate::error::{Error, ErrorKind}; use crate::grin_core::core::hash::Hash; +use crate::grin_core::core::FeeFields; use crate::grin_core::core::{Output, Transaction, TxKernel}; use crate::grin_core::libtx::{aggsig, secp_ser}; use crate::grin_core::{global, ser}; @@ -554,7 +555,7 @@ pub struct Context { /// needed by the other party pub amount: u64, /// store the calculated fee - pub fee: u64, + pub fee: Option, /// Payment proof sender address derivation path, if needed pub payment_proof_derivation_index: Option, /// If late-locking, store my tranasction creation prefs @@ -608,7 +609,7 @@ impl Context { input_ids: vec![], output_ids: vec![], amount: 0, - fee: 0, + fee: None, payment_proof_derivation_index: None, late_lock_args: None, calculated_excess: None, @@ -818,8 +819,7 @@ pub struct TxLogEntry { #[serde(with = "secp_ser::string_or_u64")] pub amount_debited: u64, /// Fee - #[serde(with = "secp_ser::opt_string_or_u64")] - pub fee: Option, + pub fee: Option, /// Cutoff block height #[serde(with = "secp_ser::opt_string_or_u64")] #[serde(default)] diff --git a/libwallet/tests/libwallet.rs b/libwallet/tests/libwallet.rs index 761c01bf1..cc300ca81 100644 --- a/libwallet/tests/libwallet.rs +++ b/libwallet/tests/libwallet.rs @@ -14,6 +14,7 @@ //! core::libtx specific tests use grin_wallet_libwallet::Context; use grin_wallet_util::grin_core::core::transaction; +use grin_wallet_util::grin_core::core::FeeFields; use grin_wallet_util::grin_core::libtx::{aggsig, proof}; use grin_wallet_util::grin_keychain::{ BlindSum, BlindingFactor, ExtKeychain, ExtKeychainPath, Keychain, SwitchCommitmentType, @@ -23,9 +24,11 @@ use grin_wallet_util::grin_util::secp::key::{PublicKey, SecretKey}; use rand::thread_rng; fn kernel_sig_msg() -> secp::Message { - transaction::KernelFeatures::Plain { fee: 0 } - .kernel_sig_msg() - .unwrap() + transaction::KernelFeatures::Plain { + fee: FeeFields::zero(), + } + .kernel_sig_msg() + .unwrap() } #[test] diff --git a/src/bin/grin-wallet.rs b/src/bin/grin-wallet.rs index 0ee2fa5fa..c9071b4f9 100644 --- a/src/bin/grin-wallet.rs +++ b/src/bin/grin-wallet.rs @@ -153,6 +153,8 @@ fn real_main() -> i32 { .clone(), ); + global::init_global_accept_fee_base(config.members.as_ref().unwrap().wallet.accept_fee_base()); + let wallet_config = config.clone().members.unwrap().wallet; let node_client = HTTPNodeClient::new(&wallet_config.check_node_api_http_addr, None);