diff --git a/BlueComponents.js b/BlueComponents.js index a53163641..9cd56ef41 100644 --- a/BlueComponents.js +++ b/BlueComponents.js @@ -8,7 +8,6 @@ import { Alert, Animated, Dimensions, - FlatList, Image, InputAccessoryView, Keyboard, @@ -458,17 +457,15 @@ export class BlueWalletNavigationHeader extends Component { } } -export const BlueButtonLinkHook = props => { +export const BlueButtonLink = props => { const { colors } = useTheme(); return ( {props.title} @@ -476,23 +473,6 @@ export const BlueButtonLinkHook = props => { ); }; -export class BlueButtonLink extends Component { - render() { - return ( - - {this.props.title} - - ); - } -} - export const BlueAlertWalletExportReminder = ({ onSuccess = () => {}, onFailure }) => { Alert.alert( loc.wallets.details_title, @@ -546,6 +526,8 @@ export const BlueNavigationStyle = (navigation, withNavigationCloseButton = fals }; export const BlueCreateTxNavigationStyle = (navigation, withAdvancedOptionsMenuButton = false, advancedOptionsMenuButtonAction) => { + const { colors, closeImage } = useTheme(); + let headerRight; if (withAdvancedOptionsMenuButton) { headerRight = () => ( @@ -554,7 +536,7 @@ export const BlueCreateTxNavigationStyle = (navigation, withAdvancedOptionsMenuB onPress={advancedOptionsMenuButtonAction} testID="advancedOptionsMenuButton" > - + ); } else { @@ -568,9 +550,9 @@ export const BlueCreateTxNavigationStyle = (navigation, withAdvancedOptionsMenuB }, headerTitleStyle: { fontWeight: '600', - color: BlueCurrentTheme.colors.foregroundColor, + color: colors.foregroundColor, }, - headerTintColor: BlueCurrentTheme.colors.foregroundColor, + headerTintColor: colors.foregroundColor, headerLeft: () => ( - + ), headerRight, @@ -675,11 +657,9 @@ export const SafeBlueArea = props => { return ; }; -export class BlueCard extends Component { - render() { - return ; - } -} +export const BlueCard = props => { + return ; +}; export const BlueText = props => { const { colors } = useTheme(); @@ -760,122 +740,111 @@ export const BlueFormLabel = props => { return ; }; -export class BlueFormInput extends Component { - render() { - return ( - - ); - } -} +export const BlueFormInput = props => { + const { colors } = useTheme(); + return ( + + ); +}; -export class BlueFormMultiInput extends Component { - constructor(props) { - super(props); - this.state = { - selection: { start: 0, end: 0 }, - }; - } +export const BlueFormMultiInput = props => { + const { colors } = useTheme(); - render() { - return ( - - ); - } -} + return ( + + ); +}; -export class BlueHeader extends Component { - render() { - return ( +export const BlueHeader = props => { + return ( +
+ ); +}; + +export const BlueHeaderDefaultSub = props => { + const { colors } = useTheme(); + return ( +
- ); - } -} - -export class BlueHeaderDefaultSub extends Component { - render() { - return ( - -
- {this.props.leftText} - - } - rightComponent={ - { - if (this.props.onClose) this.props.onClose(); - }} - > - - - - + leftComponent={ + + {props.leftText} + + } + rightComponent={ + { + if (props.onClose) props.onClose(); + }} + > + + + - - } - {...this.props} - /> - - ); - } -} + + + } + {...props} + /> + + ); +}; export const BlueHeaderDefaultSubHooks = props => { const { colors } = useTheme(); @@ -938,11 +907,9 @@ export const BlueHeaderDefaultMain = props => { ); }; -export class BlueSpacing extends Component { - render() { - return ; - } -} +export const BlueSpacing = props => { + return ; +}; export const BlueSpacing40 = props => { return ; @@ -972,12 +939,6 @@ export const BlueSpacing10 = props => { return ; }; -export class BlueList extends Component { - render() { - return ; - } -} - export class BlueUseAllFundsButton extends Component { static InputAccessoryViewID = 'useMaxInputAccessoryViewID'; static propTypes = { @@ -1110,19 +1071,9 @@ export class BlueDoneAndDismissKeyboardInputAccessory extends Component { } } -export class BlueLoading extends Component { - render() { - return ( - - - - ); - } -} - -export const BlueLoadingHook = () => { +export const BlueLoading = props => { return ( - + ); @@ -1421,93 +1372,6 @@ export const BlueReceiveButtonIcon = props => { ); }; -export class BlueScanButton extends Component { - render() { - return ( - - - - - - - - {loc.send.details_scan} - - - - - ); - } -} - -export class BlueSendButtonIcon extends Component { - render() { - return ( - - - - - - - - {loc.send.header} - - - - - ); - } -} - export const BlueTransactionListItem = React.memo(({ item, itemPriceUnit = BitcoinUnit.BTC, timeElapsed }) => { const [subtitleNumberOfLines, setSubtitleNumberOfLines] = useState(1); const { colors } = useTheme(); diff --git a/Navigation.js b/Navigation.js index 44e8d81bb..637c63e70 100644 --- a/Navigation.js +++ b/Navigation.js @@ -75,6 +75,7 @@ import DrawerList from './screen/wallets/drawerList'; import { isTablet } from 'react-native-device-info'; import SettingsPrivacy from './screen/settings/SettingsPrivacy'; import LNDViewAdditionalInvoicePreImage from './screen/lnd/lndViewAdditionalInvoicePreImage'; +import PsbtMultisigQRCode from './screen/send/psbtMultisigQRCode'; const defaultScreenOptions = Platform.OS === 'ios' @@ -182,6 +183,7 @@ const SendDetailsRoot = () => ( /> + { + LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); this.setState(prevState => ({ hideControls: !prevState.hideControls })); }} > diff --git a/img/msvault.json b/img/msvault.json index 82fa74205..86cadb99d 100644 --- a/img/msvault.json +++ b/img/msvault.json @@ -1 +1 @@ -{"ip":0,"fr":60,"v":"5.1.20","assets":[],"layers":[{"ty":4,"nm":"layer1","ip":0,"st":0,"ind":4,"hix":2,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":90,"s":[0],"e":[100],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":145}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[136,126.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[498.6695000000005],"e":[498.6695000000005],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":112}]},"y":{"a":1,"k":[{"t":0,"s":[293.7280000000012],"e":[310.2990000000002],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":90,"s":[310.2990000000002],"e":[321.7990000000002],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":145}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"layer1 shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[1106.93414,744.000839],[1111.56595,746.152995],[1130.43379,767.809064],[1139.01627,782.605136],[1164.03939,827.985851],[1164.11506,828.314683],[1164.49126,830.221585],[1164.2188,839.906287],[1139.01627,886.312149],[1131.0671,900.018484],[1130.64529,900.744482],[1130.64529,900.744482],[1130.43379,901.10822],[1111.56595,922.764289],[1111.56595,922.764289],[1106.93414,924.916445],[1065.04345,924.9837],[1056.24745,924.999848],[1051.07164,925],[1020.42816,924.647426],[1006.26026,917.047625],[995.566211,901.10822],[995.354715,900.744482],[994.932895,900.018484],[986.983729,886.312149],[961.781202,839.906287],[961.508742,830.221585],[961.884941,828.314683],[961.960609,827.985851],[986.983729,782.605136],[995.566211,767.809064],[1014.43405,746.152995],[1014.43405,746.152995],[1019.06586,744.000839]],"i":[[0,0],[0,0],[-8.241909999999962,-14.325288],[-0.8173800000001847,-1.3450980000000072],[-1.1324499999998352,-4.763622000000055],[0,0],[-0.1273799999999028,-0.6880170000000589],[0.9536099999997987,-4.304311999999982],[24.11268999999993,-40.89096299999994],[3.717440000000124,-6.401139999999941],[0,0],[0,0],[0,0],[7.152070000000094,-3.2954879999999775],[0,0],[0,0],[0,0],[2.859559999999874,-0.0020719999999982974],[0,0],[1.1838399999999183,0.21252500000002783],[3.746319999999969,3.69901799999991],[4.972389000000021,8.608624000000077],[0.07044399999995221,0.1211830000000873],[0,0],[0.7735910000000104,1.2730380000000423],[1.3622990000000073,5.9856829999999945],[-0.7492640000000392,4.035292000000027],[-0.13463600000000042,0.6041080000001102],[0,0],[-21.09655900000007,35.80918399999996],[-3.9506659999999556,6.792741999999976],[-7.152069999999981,3.295488999999975],[0,0],[0,0]],"o":[[0,0],[7.152070000000094,3.295488999999975],[3.9506699999999455,6.792741999999976],[21.096559999999954,35.80918399999996],[0,0],[0.13463999999999032,0.6041080000001102],[0.7492600000000493,4.035292000000027],[-1.3623000000000047,5.9856829999999945],[-0.7735900000000129,1.2730380000000423],[0,0],[0,0],[0,0],[-8.241909999999962,14.325288],[0,0],[0,0],[0,0],[-2.9929699999997865,0.008742999999981294],[0,0],[-16.670429999999897,-0.011471000000028653],[-4.699929999999995,-0.8070589999999811],[-2.4521399999999858,-2.488429999999994],[-0.07054699999991954,-0.12129899999990812],[0,0],[-3.717439000000013,-6.401139999999941],[-24.11268800000005,-40.89096299999994],[-0.9536090000000286,-4.304311999999982],[0.1273750000000291,-0.6880170000000589],[0,0],[1.1324520000000575,-4.763622000000055],[0.8173789999999599,-1.3450980000000072],[8.241909000000078,-14.325288],[0,0],[0,0],[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[1084.28869,779.000839],[1041.71572,779.000839],[1050.40471,832.550349],[1034,858.33925],[1063,887.000839],[1092,858.33925],[1075.59529,832.550349],[1075.59529,832.550349]],"i":[[0,0],[0,0],[0,0],[0,-11.360174000000029],[-16.017160000000104,0],[0,15.821545000000015],[9.693089999999984,4.639825999999971],[0,0]],"o":[[0,0],[0,0],[-9.697499999999991,4.639825999999971],[0,15.821545000000015],[16.017160000000104,0],[0,-11.360174000000029],[0,0],[0,0]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.40784313725490196,0.7333333333333333,0.8823529411764706,1,0.5450980392156862,0.8431372549019608,0.9764705882352941]}},"t":1,"s":{"a":0,"k":[582.24563,25.2094246925]},"e":{"a":0,"k":[582.24563,925]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[-100,100]},"p":{"a":0,"k":[-927,959]},"r":{"a":0,"k":180.02333923010465}}]}],"op":145},{"ty":4,"nm":"layer2","ip":0,"st":0,"ind":3,"hix":3,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":67,"s":[0],"e":[100],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":125}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[210,193.5,0]},"p":{"s":true,"x":{"a":0,"k":499.18443847656323},"y":{"a":1,"k":[{"t":0,"s":[307.7270000000012],"e":[307.7270000000012],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":52,"s":[307.7270000000012],"e":[322.7275000000013],"i":{"x":[0.355],"y":[1]},"o":{"x":[0.645],"y":[0.045]}},{"t":125}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"layer2 shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[1138.37719,675.0008],[1146.32394,678.746265],[1178.69523,716.435003],[1178.69523,716.435003],[1179.20307,717.321045],[1179.20307,717.321045],[1179.70958,718.205364],[1180.21428,719.087116],[1180.71674,719.965455],[1193.42007,742.185073],[1237.12716,825.05348],[1236.6597,841.908071],[1193.42007,922.669654],[1180.71674,944.889272],[1180.21428,945.767611],[1179.70958,946.649362],[1179.20307,947.533682],[1179.20307,947.533682],[1178.69523,948.419724],[1146.32394,986.108462],[1146.32394,986.108462],[1138.37719,989.853927],[1066.50592,989.970973],[1050.28516,989.999806],[1043.62397,990],[989.960085,989.385744],[965.652401,976.159572],[947.304774,948.419724],[947.304774,948.419724],[946.796931,947.533682],[946.796931,947.533682],[946.290425,946.649362],[945.785715,945.767611],[945.283263,944.889272],[932.579927,922.669654],[889.340297,841.908071],[888.872842,825.05348],[932.579927,742.185073],[945.283263,719.965455],[945.785715,719.087116],[946.290425,718.205364],[946.796931,717.321045],[946.796931,717.321045],[947.304774,716.435003],[979.676064,678.746265],[979.676064,678.746265],[987.622807,675.0008]],"i":[[0,0],[0,0],[-14.140530000000126,-24.930749000000105],[0,0],[0,0],[0,0],[0,0],[-0.16787999999996828,-0.29339500000003227],[0,0],[-1.2621299999998428,-2.1068239999999605],[-1.9866899999999532,-10.885257000000024],[1.6361000000001695,-7.490928999999937],[41.36981000000014,-71.16383000000008],[6.0140499999999975,-10.516211999999996],[0,0],[0.16856000000007043,-0.2943920000000162],[0,0],[0,0],[0,0],[12.270700000000033,-5.735243000000082],[0,0],[0,0],[0,0],[5.2592500000000655,-0.0029430000000729706],[0,0],[2.056803999999943,0.37454600000000937],[6.427511999999979,6.437516999999957],[8.53106200000002,14.981857999999988],[0,0],[0,0],[0,0],[0,0],[0.16788600000006682,0.29339500000003227],[0,0],[1.2621299999999565,2.1068239999999605],[2.3372770000000855,10.41707400000007],[-1.2855029999999488,7.022745999999984],[-41.60353599999996,71.63201300000003],[-6.0140480000000025,10.516210999999998],[0,0],[-0.16856200000006538,0.2943920000000162],[0,0],[0,0],[0,0],[-12.27070500000002,5.735241999999971],[0,0],[0,0]],"o":[[0,0],[12.270700000000033,5.735241999999971],[0,0],[0,0],[0,0],[0,0],[0.16856000000007043,0.2943920000000162],[0,0],[6.0140499999999975,10.516210999999998],[41.603540000000066,71.63201300000003],[1.2854999999999563,7.022745999999984],[-2.3372699999999895,10.41707400000007],[-1.2621299999998428,2.1068239999999605],[0,0],[-0.16787999999996828,0.29339500000003227],[0,0],[0,0],[0,0],[-14.140530000000126,24.93074899999999],[0,0],[0,0],[0,0],[-5.529999999999973,0.016386000000011336],[0,0],[-29.13182000000006,-0.014982000000031803],[-8.063607000000047,-1.4045490000000882],[-4.207099000000085,-4.330693999999994],[0,0],[0,0],[0,0],[0,0],[-0.16856200000006538,-0.2943920000000162],[0,0],[-6.0140480000000025,-10.516211999999996],[-41.369808000000035,-71.16383000000008],[-1.6360939999999573,-7.490928999999937],[1.9866849999999658,-10.885257000000024],[1.2621299999999565,-2.1068239999999605],[0,0],[0.16788600000006682,-0.29339500000003227],[0,0],[0,0],[0,0],[14.140528000000018,-24.930749000000105],[0,0],[0,0],[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[1084.28869,778.0008],[1041.71572,778.0008],[1050.40471,831.55031],[1034,857.339211],[1063,886.0008],[1092,857.339211],[1075.59529,831.55031],[1075.59529,831.55031]],"i":[[0,0],[0,0],[0,0],[0,-11.360174000000029],[-16.017160000000104,0],[0,15.821545000000015],[9.693089999999984,4.639826000000085],[0,0]],"o":[[0,0],[0,0],[-9.697499999999991,4.639826000000085],[0,15.821545000000015],[16.017160000000104,0],[0,-11.360174000000029],[0,0],[0,0]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.24705882352941178,0.47058823529411764,0.8627450980392157,1,0.1843137254901961,0.37254901960784315,0.7019607843137254]}},"t":1,"s":{"a":0,"k":[652.8979164670848,990]},"e":{"a":0,"k":[652.8979164670848,0]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[-100,100]},"p":{"a":0,"k":[-853,1024]},"r":{"a":0,"k":180.02333923010465}}]}],"op":145},{"ty":4,"nm":"layer3","ip":0,"st":0,"ind":2,"hix":4,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":31,"s":[0],"e":[100],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":84}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[285,272.5,0]},"p":{"s":true,"x":{"a":0,"k":499.26000000000073},"y":{"a":1,"k":[{"t":0,"s":[310.7280000000012],"e":[310.7280000000012],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":31,"s":[310.7280000000012],"e":[322.7275000000013],"i":{"x":[0.355],"y":[1]},"o":{"x":[0.645],"y":[0.045]}},{"t":84}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"layer3 shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[1135.99518,599.121095],[1179.79758,612.506285],[1202.23956,626.2312],[1240.16108,669.919917],[1240.54725,670.589846],[1240.83219,671.084973],[1240.92693,671.249749],[1241.11682,671.580168],[1248.88101,685.07168],[1256.70702,698.686829],[1256.87838,698.995736],[1256.87838,698.995736],[1256.99092,699.199469],[1257.04692,699.301097],[1257.27099,699.709302],[1257.73612,700.563169],[1259.69642,703.75659],[1262.19748,708.173023],[1267.20192,716.991708],[1267.8581,718.138282],[1269.1599,720.403146],[1277.08617,734.187523],[1277.20813,734.402151],[1277.38998,734.722564],[1277.51151,734.936924],[1278.01501,735.82669],[1279.97531,739.088056],[1282.47637,743.504489],[1289.50638,755.734612],[1306.13508,790.726352],[1312.08355,818.244128],[1309.65008,866.485168],[1289.50638,913.367306],[1282.47637,925.597429],[1279.97531,930.013862],[1278.01501,933.275228],[1277.51151,934.164994],[1277.38998,934.379354],[1277.20813,934.699767],[1277.08617,934.914395],[1269.1599,948.698772],[1267.8581,950.963636],[1267.20192,952.11021],[1262.19748,960.928895],[1261.94712,961.398511],[1259.69642,965.345328],[1257.73612,968.606694],[1257.55724,968.928556],[1257.44136,969.136719],[1257.44136,969.136719],[1257.32743,969.34106],[1257.2148,969.5427],[1257.04692,969.842548],[1256.82168,970.243356],[1256.70702,970.446716],[1248.88101,984.030238],[1241.11682,997.521749],[1240.92693,997.852169],[1240.83219,998.016945],[1240.54725,998.512072],[1240.16108,999.182001],[1202.23956,1042.87072],[1179.79758,1056.59563],[1135.99518,1069.98082],[1064.58609,1070.99959],[1060.46691,1070.99959],[989.311203,1069.98082],[973.764053,1066.99124],[969.032312,1065.70028],[946.184762,1056.59563],[914.617288,1035.4647],[898.732157,1018.68225],[896.028305,1015.285],[887.700819,1002.45377],[887.280622,1001.73174],[886.651918,1000.64156],[886.027779,999.547009],[885.821263,999.182001],[885.645757,998.875031],[885.471884,998.571154],[877.10134,984.030238],[868.935428,969.842548],[868.767543,969.5427],[868.246224,968.606694],[867.988611,968.157299],[866.285931,965.345328],[863.784868,960.928895],[858.343182,951.345872],[857.905435,950.581979],[856.822449,948.698772],[849.338572,935.691143],[849.208691,935.463388],[848.896175,934.914395],[848.652953,934.486157],[848.592365,934.379354],[848.470841,934.164994],[848.470841,934.164994],[848.348272,933.948616],[847.967333,933.275228],[846.00704,930.013862],[843.505977,925.597429],[836.543558,913.367306],[822.686316,886.528981],[822.469288,885.973411],[822.253739,885.416503],[820.320445,880.413919],[816.39986,866.485168],[813.898796,818.244128],[819.847271,790.726352],[836.475962,755.734612],[843.505977,743.504489],[846.00704,739.088056],[847.967333,735.894635],[848.409731,735.095833],[848.53169,734.876364],[848.652953,734.658549],[848.896175,734.222993],[856.822449,720.403146],[857.905435,718.519938],[858.343182,717.756046],[863.784868,708.173023],[866.285931,703.75659],[867.878923,701.137764],[868.124128,700.709608],[868.246224,700.495224],[868.36623,700.279226],[868.767543,699.559218],[868.935428,699.25937],[877.10134,685.07168],[884.878604,671.604105],[885.050901,671.308335],[885.392149,670.723056],[885.562812,670.430573],[885.821263,669.987862],[896.028305,653.816922],[898.732157,650.419665],[946.184762,612.506285],[989.987166,599.121095],[1060.95844,598.000448],[1065.0239,598.000448]],"i":[[-5.133939999999939,-0.7324489999999741],[-16.290700000000015,-7.949580000000083],[-6.692039999999906,-5.163828999999964],[-10.883000000000038,-19.09258100000011],[-0.12720000000012988,-0.22088799999994535],[0,0],[-0.03159000000005108,-0.05494999999996253],[0,0],[-4.450090000000046,-7.700448000000051],[-1.1951100000001134,-2.1489840000000413],[0,0],[0,0],[0,0],[-0.018649999999979627,-0.0338729999999714],[0,0],[-0.162230000000136,-0.298958999999968],[-0.27038999999990665,-0.3397259999999278],[-1.0815400000001318,-2.038353999999913],[-2.108799999999974,-3.689345000000003],[0,0],[-0.42693000000008396,-0.7402439999999615],[-1.2662399999999252,-2.227265000000102],[0,0],[-0.060619999999971697,-0.10687800000005154],[0,0],[-0.17557000000010703,-0.3106070000000045],[-0.270390000000134,-0.3397260000000415],[-1.0815400000001318,-2.0383540000000266],[-2.771439999999984,-4.688214000000016],[-2.974240000000009,-9.444373000000041],[-1.5547100000001137,-12.90957400000002],[3.312220000000025,-14.540256999999997],[10.545029999999997,-18.073403999999982],[1.1491399999999885,-2.0383540000000266],[0.2703799999999319,-0.3397260000000415],[0.8111599999999726,-1.42684799999995],[0.1625699999999597,-0.28688899999997375],[0,0],[0.060750000000098225,-0.10695899999996072],[0,0],[5.1706799999999475,-8.972286999999938],[0.4378400000000511,-0.764049],[0,0],[0.8769700000000284,-1.555586000000062],[0,0],[0.24957999999992353,-0.3135929999999689],[0.8111599999999726,-1.42684799999995],[0.0585399999999936,-0.10522299999990992],[0,0],[0,0],[0,0],[0.03739999999993415,-0.06688799999994899],[0,0],[0.07583999999997104,-0.13466699999992215],[0,0],[5.081549999999879,-8.793798000000038],[1.5866399999999885,-2.761842999999999],[0,0],[0.03157999999984895,-0.05491299999994226],[0,0],[0.13068999999995867,-0.22648400000002766],[17.101859999999988,-13.181359999999813],[8.58474000000001,-4.144649999999956],[17.980620000000044,-2.581910000000107],[33.63390000000004,-0.01330999999981941],[0,0],[4.50461800000005,0.6658700000000408],[3.3122190000000273,0.8832800000000134],[1.2843299999999545,0.3397299999999177],[10.815408000000048,5.231780000000072],[10.747811999999954,9.308479999999918],[4.393758999999932,5.707390000000146],[0.20278899999993882,0.20383000000003904],[3.7122269999999844,6.356010000000083],[0,0],[0.20897400000001198,0.36437999999998283],[0,0],[0.06868599999995695,0.12164399999994657],[0.058179999999993015,0.10172099999999773],[0,0],[5.122054999999932,8.898619999999937],[1.2682160000000522,2.261620999999991],[0,0],[0.1825099999999793,0.32868500000006406],[0,0],[0.24192400000004,0.36475800000005165],[1.0815410000000156,2.038353000000029],[2.26217900000006,3.9511529999999766],[0,0],[0.3557700000000068,0.6168700000000626],[1.2070770000000266,2.1156089999999494],[0,0],[0.10211600000002363,0.17961800000000494],[0,0],[0.020206000000030144,0.035625999999979285],[0,0],[0,0],[0,0],[0.13168099999995775,0.23295500000006086],[0.27038600000003044,0.4076709999999366],[1.0815410000000156,2.038353999999913],[2.7038519999999835,4.688214000000016],[2.16308099999992,5.63944499999991],[0.07217900000000554,0.18568499999992127],[0,0],[0.28969900000004145,0.6406259999999975],[0.8787519999999631,3.940817999999922],[-1.8250999999999067,15.287653999999975],[-3.9205859999999575,12.50190299999997],[-8.179152999999928,13.996696000000043],[-1.149136999999996,2.038353999999913],[-0.2703849999999193,0.40766999999993914],[-0.8111550000000989,1.3589020000000573],[-0.14296300000000883,0.25748700000008284],[0,0],[-0.040382000000022344,0.07246499999996558],[0,0],[-5.170677999999953,8.972286000000054],[-0.3644239999999854,0.6353510000000142],[0,0],[-0.9374540000000025,1.6628680000000031],[-0.27038500000003296,0.4076710000000503],[-0.6937920000000304,1.2067560000000412],[0,0],[-0.040558000000032735,0.07134199999995872],[0,0],[-0.13088100000004488,0.23410699999999451],[0,0],[-5.573315000000093,9.644811000000004],[-1.5017930000000206,2.5788250000000517],[0,0],[-0.11357599999996637,0.19469299999991563],[0,0],[-0.08690999999998894,0.148832000000084],[-1.0815410000000156,0.8832859999999982],[-1.2843300000000681,1.6986279999999851],[-18.453791000000024,8.968755999999985],[-17.980617000000052,2.5819139999999834],[-33.19376000000011,0.014648999999963053],[0,0]],"o":[[17.980620000000044,2.5819139999999834],[8.58474000000001,4.144651999999951],[17.101859999999988,13.181355000000053],[0.13068999999995867,0.2264829999999165],[0,0],[0.03157999999984895,0.05491200000005847],[0,0],[1.5866399999999885,2.7618439999999964],[5.081549999999879,8.793798000000038],[0,0],[0,0],[0,0],[0.01869000000010601,0.03388699999993605],[0,0],[0.1501299999999901,0.2742950000000519],[0.8111599999999726,1.3589019999999437],[0.2703799999999319,0.4076710000000503],[0.8769700000000284,1.555586000000062],[0,0],[0.4378400000000511,0.7640480000000025],[5.1706799999999475,8.972286000000054],[0,0],[0.060750000000098225,0.10695799999996325],[0,0],[0.1625699999999597,0.28688899999997375],[0.8111599999999726,1.4268470000000661],[0.2703799999999319,0.40766999999993914],[1.1491399999999885,2.038353999999913],[8.17915999999991,13.996696000000043],[3.9205799999999726,12.50190299999997],[1.8251000000000204,15.287653999999975],[-3.1770199999998567,13.860805999999911],[-2.771439999999984,4.688214000000016],[-1.0815400000001318,2.038353999999913],[-0.270390000000134,0.4076709999999366],[-0.17557000000010703,0.31060600000000704],[0,0],[-0.060619999999971697,0.10687799999993786],[0,0],[-1.2662399999999252,2.2272649999999885],[-0.42693000000008396,0.7402440000000752],[0,0],[-2.108799999999974,3.689345000000003],[0,0],[-1.002770000000055,1.8722790000000487],[-0.27038999999990665,0.4076710000000503],[-0.06083000000012362,0.10956100000009883],[0,0],[0,0],[0,0],[-0.03773000000001048,0.06760100000008151],[0,0],[-0.07459999999991851,0.133036000000061],[0,0],[-1.1951100000001134,2.11735699999997],[-4.450090000000046,7.70044699999994],[0,0],[-0.03159000000005108,0.05494999999996253],[0,0],[-0.12720000000012988,0.22088700000006156],[-10.883000000000038,19.092579],[-6.692039999999906,5.163830000000189],[-16.290700000000015,7.949579999999969],[-4.670229999999947,0.6658700000000408],[0,0],[-33.63059000000021,-0.01330999999981941],[-6.692033999999921,-1.019170000000031],[-1.2843299999999545,-0.4076700000000528],[-7.841171000000031,-2.1742400000000544],[-11.694161000000008,-5.639439999999922],[-5.8808780000000525,-5.163829999999962],[-1.2843300000000681,-1.69862999999998],[-0.9245430000000852,-0.7550699999999324],[0,0],[-0.20999700000004395,-0.36213999999995394],[0,0],[-0.06898499999999785,-0.12168499999995674],[-0.05887400000005982,-0.10301400000003014],[0,0],[-1.6757670000000644,-2.927601999999979],[-5.573315000000093,-9.644811000000004],[0,0],[-0.16827599999999165,-0.3009949999999435],[0,0],[-0.731802000000016,-1.2665489999999409],[-0.27038500000003296,-0.3397260000000415],[-0.9374540000000025,-1.6628680000000031],[0,0],[-0.3644239999999854,-0.6353510000000142],[-4.586892000000034,-7.959285999999906],[0,0],[-0.10683300000005147,-0.18743100000006052],[0,0],[-0.020191000000068016,-0.0355850000000828],[0,0],[0,0],[0,0],[-0.12332299999991392,-0.2177920000000313],[-0.8111550000000989,-1.42684799999995],[-0.2703849999999193,-0.3397260000000415],[-1.149136999999996,-2.0383540000000266],[-6.8272269999999935,-11.75450699999999],[-0.07242500000006658,-0.18442300000003797],[0,0],[-0.8572709999999688,-2.223767000000066],[-0.6759629999999106,-1.766572999999994],[-3.3122190000000273,-14.268476000000078],[1.554715000000101,-12.90957400000002],[2.9742370000000165,-9.444373000000041],[2.771447999999964,-4.688214000000016],[1.0815410000000156,-2.0383540000000266],[0.27038600000003044,-0.3397260000000415],[0.1536279999999124,-0.27795800000001236],[0,0],[0.040497999999956846,-0.07281299999999646],[0,0],[1.2662420000000338,-2.2627350000000206],[0.3557700000000068,-0.616869999999949],[0,0],[2.26217900000006,-3.9511529999999766],[1.0815410000000156,-2.038353999999913],[0.2298279999999977,-0.2887670000000071],[0,0],[0.04081199999995988,-0.0715300000000525],[0,0],[0.13818500000002132,-0.24856899999997495],[0,0],[1.2682160000000522,-2.2616219999999885],[4.519294999999943,-7.851437000000033],[0,0],[0.11430300000006355,-0.1961540000000923],[0,0],[0.08555100000000948,-0.14658799999995153],[4.258566999999971,-7.6098539999999275],[0.20278899999993882,-0.2038360000000239],[11.28858200000002,-14.812037000000032],[16.290708999999993,-7.949580000000083],[5.133938999999941,-0.7324489999999741],[0,0],[33.193770000000086,0.014648999999963053]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[1084.28869,779],[1041.71572,779],[1050.40471,832.54951],[1034,858.338411],[1063,887],[1092,858.338411],[1075.59529,832.54951],[1075.59529,832.54951]],"i":[[0,0],[0,0],[0,0],[0,-11.360173999999915],[-16.017160000000104,0],[0,15.821545000000015],[9.693089999999984,4.639825999999971],[0,0]],"o":[[0,0],[0,0],[-9.697499999999991,4.639825999999971],[0,15.821545000000015],[16.017160000000104,0],[0,-11.360173999999915],[0,0],[0,0]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.09019607843137255,0.27450980392156865,0.592156862745098,1,0.047058823529411764,0.1450980392156863,0.3137254901960784]}},"t":1,"s":{"a":0,"k":[656.041775,1070.99959]},"e":{"a":0,"k":[656.041775,0]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[-100,100]},"p":{"a":0,"k":[-778,1105]},"r":{"a":0,"k":180.02333923010465}}]}],"op":145},{"ty":4,"ip":0,"st":0,"ind":0,"hix":1,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[0,0,0]},"p":{"a":0,"k":[0,0,0]},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"undefined shape group","it":[{"ty":"rc","s":{"a":0,"k":[985.145,640.981]},"r":{"a":0,"k":0},"p":{"a":0,"k":[492.5725,320.4905]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"fl","o":{"a":0,"k":100},"r":1,"c":{"a":0,"k":[1,1,1,0]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0}}]}],"op":145}],"op":145,"w":986,"h":641} \ No newline at end of file +{"ip":0,"fr":60,"v":"5.1.20","assets":[],"layers":[{"ty":4,"nm":"small","ip":0,"st":0,"ind":3,"hix":1,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":100,"s":[0],"e":[100],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":154}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[26.5,23.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[117.32],"e":[117.32],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":100,"s":[117.32],"e":[117.32],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":154}]},"y":{"a":1,"k":[{"t":0,"s":[82],"e":[82],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":100,"s":[82],"e":[87.8],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":154}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"small shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[82.0311248,50.0033291],[92.9141248,50.0207291],[94.1171248,50.5796291],[99.0191248,56.2030291],[101.249125,60.0450291],[107.565202,71.2151533],[107.597302,71.3126218],[107.640338,71.4550104],[107.666389,71.5488085],[107.666389,71.5488085],[107.702829,71.6902402],[107.702829,71.6902402],[107.726135,71.7864329],[107.797125,72.0948291],[107.868125,74.6098291],[107.533066,75.8844752],[107.483461,76.0084513],[101.249125,86.9748291],[99.0191248,90.8168291],[94.1171248,96.4398291],[92.9141248,96.9988291],[70.0861248,96.9988291],[68.8821248,96.4398291],[63.9801248,90.8168291],[63.7247846,90.3773366],[61.7511248,86.9748291],[55.3157336,75.4413277],[55.273801,75.288383],[55.215033,75.0367981],[55.1939209,74.9345446],[55.15298,74.7220141],[55.1321248,74.6098291],[55.1321248,74.6098291],[55.2029248,72.0948291],[55.2738991,71.7864329],[55.2972022,71.6902402],[55.2972022,71.6902402],[55.3336401,71.5488085],[55.3336401,71.5488085],[55.3596917,71.4550104],[55.4027292,71.3126218],[55.4348315,71.2151533],[61.7511248,60.0450291],[63.9801248,56.2030291],[66.7591248,52.0640291],[70.4401248,50.0906291],[77.5912152,50],[80.6121586,50.0001263]],"i":[[-0.47856000000000165,-0.0014000000000038426],[0,0],[0,0],[-2.1410000000000053,-3.7199000000000026],[-0.2120000000000033,-0.3492000000000033],[-0.37613999999999237,-1.104272299999991],[0,0],[-0.013487999999995282,-0.04700320000000602],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.02498799999999335,-0.10969409999999868],[0.1939999999999884,-1.0480000000000018],[0.1876439999999917,-0.4828088999999949],[0,0],[4.372940999999997,-7.4187293999999895],[1.0270002000000034,-1.76400000000001],[1.8589999999999947,-0.8559999999999945],[0,0],[0,0],[0,0],[2.141999999999996,3.719999999999999],[0,0],[0.19433339999999788,0.3199167000000074],[0.3465666999999968,1.1892792999999955],[0,0],[0.017985500000001764,0.08449439999999697],[0,0],[0.013703900000002989,0.07326249999999845],[0,0],[0,0],[-0.2476999999999947,1.117999999999995],[-0.023127600000002246,0.09735900000001152],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.015303000000002953,0.04810449999999378],[0,0],[-4.9382941,8.3693247],[-1.0259999999999962,1.7637999999999963],[-0.6370000000000005,0.6462000000000003],[-1.2220000000000084,0.20949999999999847],[-3.9299147999999917,0.006343100000002266],[0,0]],"o":[[0,0],[0,0],[1.8589999999999947,0.8556999999999988],[1.0270002000000034,1.7637999999999963],[4.938293999999999,8.3693247],[0,0],[0.015302000000005478,0.04810449999999378],[0,0],[0,0],[0,0],[0,0],[0,0],[0.023131000000006452,0.09735900000001152],[0.24800000000000466,1.117999999999995],[-0.08498800000000983,0.4585411999999991],[0,0],[-0.5151170000000036,1.252854599999992],[-0.2120000000000033,0.34900000000000375],[-2.1410000000000053,3.719999999999999],[0,0],[0,0],[0,0],[-1.858000000000004,-0.8559999999999945],[0,0],[-0.9304167000000021,-1.603090800000004],[-5.1144423,-8.67614119999999],[0,0],[-0.021638599999995733,-0.08405700000000138],[0,0],[-0.01381810000000172,-0.06884850000000142],[0,0],[0,0],[-0.19460000000000122,-1.0480000000000018],[0.02498119999999915,-0.10969409999999868],[0,0],[0,0],[0,0],[0,0],[0,0],[0.013487699999998881,-0.04700320000000602],[0,0],[0.37616979999999955,-1.104272299999991],[0.2120000000000033,-0.3492000000000033],[1.2920000000000016,-2.2353999999999985],[0.972999999999999,-0.9604999999999961],[0.2878599999999949,-0.05172600000000216],[0,0],[0.4667230000000018,0.0007382000000006883]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[81.5,59],[74,66.431],[78.242,73.117],[75.995,87],[87.006,87],[84.757,73.117],[89,66.431]],"i":[[4.141999999999996,0],[0,-4.101999999999997],[-2.5080000000000098,-1.203000000000003],[0,0],[0,0],[0,0],[0,2.9450000000000074]],"o":[[-4.143000000000001,0],[0,2.9450000000000074],[0,0],[0,0],[0,0],[2.506999999999991,-1.203000000000003],[0,-4.101999999999997]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.40784313725490196,0.7333333333333333,0.8823529411764706,1,0.5450980392156862,0.8431372549019608,0.9764705882352941]}},"t":1,"s":{"a":0,"k":[1.46990586575825,94.35509322727526]},"e":{"a":0,"k":[1.46990586575825,-0.00006617392922298921]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-55,-50]},"r":{"a":0,"k":0}}]}],"op":154},{"ty":4,"nm":"medium","ip":0,"st":0,"ind":2,"hix":2,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":63,"s":[0],"e":[100],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":114}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[45.5,41,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[117.253],"e":[117.253],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":63,"s":[117.253],"e":[117.253],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":114}]},"y":{"a":1,"k":[{"t":0,"s":[80.4],"e":[80.4],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":63,"s":[80.4],"e":[87.4],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":114}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100]}},"shapes":[{"ty":"gr","nm":"medium shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[82.4111478,32.0077808],[101.098148,32.0381808],[103.164148,33.0131808],[111.581148,42.8242808],[113.751977,46.6318863],[114.019023,47.1013808],[115.409148,49.5274808],[125.349261,66.9529941],[125.47184,67.1975946],[126.479283,69.8034953],[126.513504,69.9451872],[126.530399,70.0170417],[126.564107,70.1634176],[126.651148,70.5509808],[126.773148,74.9389808],[126.66787,75.5009226],[126.637173,75.6528093],[126.637173,75.6528093],[126.60521,75.8027174],[126.475554,76.3265738],[126.431196,76.4802288],[115.409148,96.5109808],[114.019023,98.9369808],[113.751977,99.4064935],[111.581148,103.213981],[103.164148,113.024981],[101.098148,113.999981],[61.9021478,113.999981],[59.8361478,113.024981],[51.4192478,103.213981],[51.0898406,102.63832],[47.5907478,96.5109808],[36.5686966,76.4802288],[36.5243507,76.3265738],[36.3947512,75.8027174],[36.3628083,75.6528093],[36.3628083,75.6528093],[36.3321337,75.5009226],[36.2269478,74.9389808],[36.3484478,70.5509808],[36.4355847,70.1634176],[36.4693267,70.0170417],[36.4862379,69.9451872],[36.5204886,69.8034953],[37.5281355,67.1975946],[37.6507154,66.9529941],[47.5907478,49.5274808],[51.0898406,43.4000057],[51.4192478,42.8242808],[51.4192478,42.8242808],[56.1896478,35.6030808],[62.5091478,32.1600808],[75.0628822,32.0015683],[79.2887024,32.0012342]],"i":[[-1.0572058999999996,-0.003139699999998413],[0,0],[0,0],[-3.6769999999999925,-6.489899999999999],[-0.6407549999999986,-1.1265562999999972],[0,0],[-0.18250000000000455,-0.30469999999999686],[-1.212209999999999,-2.394906899999995],[0,0],[-0.179009999999991,-0.7264710999999977],[0,0],[-0.005620000000007508,-0.024085199999987594],[0,0],[-0.030350000000012756,-0.13560000000001082],[0.333999999999989,-1.828000000000003],[0.03528400000000431,-0.17875269999998977],[0,0],[0,0],[0,0],[0.04948699999999917,-0.17753610000001174],[0,0],[8.653599999999997,-14.917599999999993],[0.6911249999999995,-1.2150000000000034],[0,0],[0.7708750000000038,-1.346187999999998],[3.1899999999999977,-1.492999999999995],[0,0],[0,0],[0,0],[3.676499999999997,6.489999999999995],[0,0],[0.341906299999998,0.5709374999999994],[0.6183711999999986,2.070751999999999],[0,0],[0.03821699999999595,0.17413639999999475],[0,0],[0,0],[0,0],[0.036155000000000825,0.19831000000000643],[-0.42540000000000333,1.9499999999999886],[-0.02818990000000099,0.12367820000000052],[0,0],[-0.005653099999996414,0.023824999999987995],[0,0],[-0.6078662999999978,1.2259416999999928],[0,0],[-6.1309770000000015,10.559535000000004],[-1.6403584000000038,2.869322699999998],[0,0],[0,0],[-1.093900000000005,1.1274000000000015],[-2.0960000000000036,0.3656000000000006],[-6.8848594000000105,0.00997499999999718],[0,0]],"o":[[0,0],[0,0],[3.1899999999999977,1.493000000000002],[0.7708750000000038,1.346362500000005],[0,0],[0.6911249999999995,1.2149500000000018],[6.130920000000003,10.559535000000004],[0,0],[0.6078609999999998,1.2259416999999928],[0,0],[0.005648000000007869,0.023824999999987995],[0,0],[0.028160999999997216,0.12367820000000052],[0.4259999999999877,1.9499999999999886],[-0.03619000000000483,0.19831000000000643],[0,0],[0,0],[0,0],[-0.03823900000000435,0.17413639999999475],[0,0],[-0.6185279999999977,2.070751999999999],[-0.18250000000000455,0.30450000000000443],[0,0],[-0.6407549999999986,1.126596500000005],[-3.6769999999999925,6.489999999999995],[0,0],[0,0],[0,0],[-3.190799999999996,-1.492999999999995],[0,0],[-1.6403584000000038,-2.8690579999999954],[-8.65352,-14.917599999999993],[0,0],[-0.04947150000000278,-0.17753610000001174],[0,0],[0,0],[0,0],[-0.035257799999996564,-0.17875269999998977],[-0.3341999999999956,-1.828000000000003],[0.030384999999995443,-0.13560000000001082],[0,0],[0.0056248999999937155,-0.024085199999987594],[0,0],[0.17915769999999753,-0.7264710999999977],[0,0],[1.2122107,-2.394906899999995],[0.341906299999998,-0.5713124999999977],[0,0],[0,0],[2.2180999999999997,-3.900099999999995],[1.6714999999999947,-1.6758000000000024],[0.5017500000000013,-0.09142500000000098],[0,0],[1.0218837999999977,0.0012357000000022822]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[81.5,59],[74,66.431],[78.242,73.117],[75.995,87],[87.006,87],[84.757,73.117],[89,66.431]],"i":[[4.141999999999996,0],[0,-4.101999999999997],[-2.5080000000000098,-1.203000000000003],[0,0],[0,0],[0,0],[0,2.9450000000000074]],"o":[[-4.143000000000001,0],[0,2.9450000000000074],[0,0],[0,0],[0,0],[2.506999999999991,-1.203000000000003],[0,-4.101999999999997]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.24705882352941178,0.47058823529411764,0.8627450980392157,1,0.1843137254901961,0.37254901960784315,0.7019607843137254]}},"t":1,"s":{"a":0,"k":[130.2909583356113,-0.000026732233568627]},"e":{"a":0,"k":[130.2909583356113,113.999981]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-36,-32]},"r":{"a":0,"k":0}}]}],"op":154},{"ty":4,"nm":"big","ip":0,"st":0,"ind":1,"hix":3,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":24,"s":[0],"e":[100],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":74}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[65,61.5,0]},"p":{"s":true,"x":{"a":0,"k":116.8780517578125},"y":{"a":1,"k":[{"t":0,"s":[82.39898681640625],"e":[82.39898681640625],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":24,"s":[82.39898681640625],"e":[87.8005],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":74}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"big shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[83.0156787,12.0007419],[99.9791745,12.2640211],[111.367175,15.7447211],[117.202175,19.3138211],[127.062175,30.6747211],[127.177679,30.8754272],[127.291381,31.0733794],[129.329175,34.6148211],[131.631175,38.6256211],[132.141175,39.4737211],[132.791175,40.6221211],[134.063831,42.8658211],[134.333827,43.3375906],[134.601175,43.8025211],[134.753462,44.0667572],[136.671361,47.4027737],[136.785517,47.6038233],[136.904175,47.8133211],[137.413175,48.6614211],[138.064175,49.8098211],[139.344284,52.0534789],[139.618844,52.5252619],[139.892175,52.9902211],[145.129175,65.1820211],[145.762175,77.7260211],[144.215175,84.8820211],[139.892175,93.9810211],[139.618844,94.4459527],[139.344284,94.9177867],[138.064175,97.1620211],[137.413175,98.3100211],[136.904175,99.1580211],[136.785517,99.3676298],[136.671361,99.5687384],[136.213925,100.368521],[136.089297,100.585396],[134.601175,103.169021],[134.333827,103.63391],[134.063831,104.10563],[132.791175,106.349021],[132.141175,107.498021],[131.631175,108.328021],[131.017529,109.429273],[130.837239,109.744064],[129.329175,112.357021],[127.291381,115.89821],[127.12035,116.195934],[127.12035,116.195934],[127.062175,116.297021],[117.202175,127.658021],[111.367175,131.227021],[99.9791745,134.707021],[83.108239,134.996904],[82.0544485,134.998304],[82.0544485,134.998304],[79.9411517,134.998304],[62.0171745,134.707021],[50.6280745,131.227021],[38.2903745,121.368021],[37.5873745,120.484021],[34.9335745,116.279021],[32.6663745,112.357021],[30.3640745,108.346021],[29.8543745,107.498021],[29.2040745,106.349021],[27.9312776,104.10563],[27.661239,103.63391],[27.3938745,103.169021],[25.9059772,100.583972],[25.781362,100.366396],[25.3240977,99.55962],[25.2481489,99.4234879],[25.0915745,99.1410211],[24.5818745,98.3100211],[23.9315745,97.1620211],[22.1037745,93.9810211],[17.7802745,84.8820211],[16.2336745,77.7260211],[16.8839745,65.1820211],[17.9033745,61.5594211],[18.5184745,59.9693211],[22.1213745,52.9902211],[22.388739,52.5252619],[22.6587776,52.0534789],[23.9315745,49.8098211],[24.5818745,48.6614211],[25.0915745,47.8133211],[25.2100629,47.6038233],[25.3625912,47.3350679],[27.3938745,43.8025211],[27.526772,43.5717261],[27.661239,43.3375906],[27.9312776,42.8658211],[29.2040745,40.6221211],[29.8543745,39.4737211],[30.3640745,38.6256211],[32.6663745,34.6148211],[34.9335745,30.6747211],[37.5873745,26.4873211],[38.2903745,25.6038211],[42.4204745,21.2397211],[50.6280745,15.7447211],[56.5681745,13.3772211],[57.7991745,13.0414211],[61.8411745,12.2640211],[78.7390927,12.0007419]],"i":[[0,0],[-1.1398800000000051,-0.16251800000000038],[-4.234999999999999,-2.0671999999999997],[-1.7399999999999949,-1.3427999999999969],[-2.8299999999999983,-4.9649],[-0.03802500000000464,-0.0661428000000015],[0,0],[-1.1753080000000011,-2.0332231000000007],[-0.42200000000002547,-0.7597999999999985],[-0.06999999999999318,-0.10600000000000165],[-0.2810000000000059,-0.5300000000000011],[-0.5378440000000069,-0.941681299999999],[0,0],[-0.08787500000002524,-0.15238750000000323],[0,0],[-0.3187379999999962,-0.5604873999999995],[0,0],[-0.04125000000001933,-0.07289060000000092],[-0.06999999999999318,-0.10609999999999786],[-0.2810000000000059,-0.5300000000000011],[-0.5456719999999962,-0.9416952999999992],[0,0],[-0.09012500000000045,-0.1524000000000001],[-0.8259999999999934,-3.6049000000000007],[0.47399999999998954,-3.9749999999999943],[1.0190000000000055,-3.2510000000000048],[2.1260000000000048,-3.63900000000001],[0.09170600000001627,-0.15685350000001108],[0,0],[0.22350000000000136,-0.39750000000000796],[0.07099999999999795,-0.10599999999999454],[0.2109999999999843,-0.3709999999999951],[0.03832800000000702,-0.06762729999999806],[0,0],[0.1950000000000216,-0.339531000000008],[0,0],[0.730624999999975,-1.2678750000000036],[0.08995699999999829,-0.15682599999999525],[0,0],[0.22424999999998363,-0.39749999999999375],[0.06999999999999318,-0.10599999999999454],[0.2109999999999843,-0.35300000000000864],[0.27229299999999057,-0.4769059999999996],[0,0],[0.7459369999999979,-1.2910619999999966],[0.41747399999999857,-0.7275320000000107],[0,0],[0,0],[0,0],[4.447000000000003,-3.4280000000000115],[2.2319999999999993,-1.078000000000003],[4.675000499999996,-0.6709999999999923],[8.060794700000002,-0.014315000000010514],[0,0],[0,0],[0,0],[1.3075199999999967,0.1867200000000082],[4.235600000000005,2.066999999999979],[2.9350000000000023,3.850999999999999],[0.05269999999999442,0.05299999999999727],[1.1071999999999989,1.9789999999999992],[1.4235999999999933,2.472999999999999],[0.4217999999999975,0.7600000000000051],[0.07029999999999959,0.08800000000000807],[0.28119999999999834,0.5300000000000011],[0.5379468999999979,0.9415789999999902],[0,0],[0.08787500000000037,0.15237499999999216],[0.30955120000000136,0.539873],[0,0],[0.1273844000000004,0.22774290000000974],[0,0],[0.054912500000000364,0.09937499999999488],[0.07029999999999959,0.08799999999999386],[0.28119999999999834,0.5300000000000011],[0.720600000000001,1.218999999999994],[0.773299999999999,2.456000000000003],[0.4042999999999992,3.3569999999999993],[-0.8612000000000002,3.7099999999999937],[-0.1758000000000024,0.4596000000000018],[-0.2636000000000003,0.6713999999999984],[-1.775100000000002,3.056600000000003],[-0.08996760000000137,0.15684830000000005],[0,0],[-0.22409999999999997,0.39757499999999624],[-0.07030000000000314,0.08830000000000382],[-0.21089999999999876,0.3709999999999951],[-0.03828090000000017,0.06759950000000003],[0,0],[-1.3043750000000003,2.2637500000000017],[0,0],[-0.04498379999999713,0.07842070000000234],[0,0],[-0.22409999999999997,0.39757499999999624],[-0.07029999999999959,0.08830000000000382],[-0.2109000000000023,0.3710000000000022],[-1.7048000000000023,2.9506999999999977],[-0.47449999999999903,0.8304000000000009],[-0.28120000000000545,0.22970000000000113],[-0.33389999999999986,0.4416999999999973],[-1.5289999999999964,1.3428000000000004],[-3.0404999999999944,1.4665],[-2.0383999999999958,0.5653000000000006],[-0.3339999999999961,0.10609999999999964],[-1.740000000000002,0.26509999999999856],[-8.164910199999994,0.013001499999999666]],"o":[[8.16814860000001,0.013001499999999666],[4.675000499999996,0.6713999999999984],[2.2319999999999993,1.0777999999999999],[4.447000000000003,3.4277000000000015],[0.03915299999999888,0.06796149999999912],[0,0],[0.41747399999999857,0.7273813000000011],[1.7050000000000125,2.9506999999999977],[0.2109999999999843,0.3710000000000022],[0.06999999999999318,0.08830000000000382],[0.22424999999998363,0.39757499999999624],[0,0],[0.08995699999999829,0.15684140000000468],[0,0],[1.233883999999989,2.140948900000005],[0,0],[0.03832800000000702,0.06759950000000003],[0.2109999999999843,0.3709999999999951],[0.07099999999999795,0.08830000000000382],[0.22350000000000136,0.39757499999999624],[0,0],[0.09170600000001627,0.15684830000000005],[2.7409999999999854,4.699800000000003],[0.86099999999999,3.781000000000006],[-0.40500000000000114,3.3569999999999993],[-0.7729999999999961,2.456000000000003],[-0.09012500000000045,0.15237499999999216],[0,0],[-0.5456719999999962,0.9418594000000127],[-0.2810000000000059,0.5300000000000011],[-0.06999999999999318,0.08799999999999386],[-0.04125000000001933,0.07293749999999477],[0,0],[-0.12749499999998193,0.22423580000000243],[0,0],[-0.30957999999998265,0.538449],[-0.08787500000002524,0.15237499999999216],[0,0],[-0.5378440000000069,0.9415789999999902],[-0.2810000000000059,0.5300000000000011],[-0.06999999999999318,0.08800000000000807],[-0.19781300000002489,0.3646879999999868],[0,0],[-0.30904100000000767,0.538250000000005],[-1.1753080000000011,2.033307999999991],[0,0],[0,0],[0,0],[-2.8299999999999983,4.965000000000003],[-1.7399999999999949,1.3430000000000035],[-4.234999999999999,2.066999999999979],[-1.2535000000000025,0.17894000000001142],[0,0],[0,0],[0,0],[-8.445551600000002,-0.007468999999986181],[-4.675000000000004,-0.6709999999999923],[-4.797999999999995,-2.3329999999999984],[-0.33389999999999986,-0.44199999999999307],[-0.28120000000000545,-0.2289999999999992],[-0.47449999999999903,-0.8130000000000024],[-1.7048000000000023,-2.9510000000000076],[-0.2109000000000023,-0.3709999999999951],[-0.07029999999999959,-0.10599999999999454],[-0.22409999999999997,-0.39749999999999375],[0,0],[-0.08996759999999782,-0.15682599999999525],[-0.7304499999999976,-1.2678750000000036],[0,0],[-0.19497650000000277,-0.3408589999999947],[0,0],[-0.050591600000000625,-0.09090429999999117],[-0.21089999999999876,-0.3539999999999992],[-0.07030000000000314,-0.10599999999999454],[-0.29879999999999995,-0.5300000000000011],[-2.1266,-3.63900000000001],[-1.0193000000000012,-3.2510000000000048],[-0.47449999999999903,-3.9749999999999943],[0.22850000000000037,-1.0250000000000057],[0.08779999999999788,-0.19429999999999836],[0.5624000000000002,-1.4665000000000035],[0.08787499999999682,-0.1524000000000001],[0,0],[0.5379468999999979,-0.9416952999999992],[0.28119999999999834,-0.5300000000000011],[0.07029999999999959,-0.10609999999999786],[0.04118439999999879,-0.07289060000000092],[0,0],[0.3235342999999986,-0.5687064999999976],[0,0],[0.0446107999999974,-0.07757900000000006],[0,0],[0.5379468999999979,-0.941681299999999],[0.28119999999999834,-0.5300000000000011],[0.07029999999999959,-0.10600000000000165],[0.4217999999999975,-0.7597999999999985],[1.4235999999999933,-2.4735999999999976],[1.1071999999999989,-1.961199999999998],[0.05269999999999442,-0.053000000000000824],[1.142400000000002,-1.4841000000000015],[2.7944999999999993,-2.4206000000000003],[2.8120000000000047,-1.3604000000000003],[0.3340000000000032,-0.08840000000000003],[0.8609999999999971,-0.22960000000000136],[1.0993999999999957,-0.16251800000000038],[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"v":[[83.0156787,12.0007419]],"i":[[0,0]],"o":[[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[81.5,59],[74,66.431],[78.242,73.117],[75.995,87],[87.006,87],[84.757,73.117],[89,66.431]],"i":[[4.141999999999996,0],[0,-4.101999999999997],[-2.5080000000000098,-1.203000000000003],[0,0],[0,0],[0,0],[0,2.9450000000000074]],"o":[[-4.143000000000001,0],[0,2.9450000000000074],[0,0],[0,0],[0,0],[2.506999999999991,-1.203000000000003],[0,-4.101999999999997]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.09019607843137255,0.27450980392156865,0.592156862745098,1,0.047058823529411764,0.1450980392156863,0.3137254901960784]}},"t":1,"s":{"a":0,"k":[145.7622595420615,-0.000027438741028782045]},"e":{"a":0,"k":[145.7622595420615,134.9985780465571]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-16,-12]},"r":{"a":0,"k":0}}]}],"op":154}],"op":154,"w":233,"h":176} \ No newline at end of file diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 43310111c..4e73376b3 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1513,7 +1513,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1556,7 +1556,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1597,7 +1597,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1636,7 +1636,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1675,7 +1675,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; @@ -1717,7 +1717,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1757,7 +1757,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1800,7 +1800,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1841,7 +1841,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; @@ -1885,7 +1885,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1926,7 +1926,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; @@ -1969,7 +1969,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2111,7 +2111,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -2151,7 +2151,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -2185,7 +2185,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -2221,7 +2221,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 5.6.7; + MARKETING_VERSION = 5.6.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/fastlane/metadata/en-US/release_notes.txt b/ios/fastlane/metadata/en-US/release_notes.txt index f93da828f..673b18a7b 100644 --- a/ios/fastlane/metadata/en-US/release_notes.txt +++ b/ios/fastlane/metadata/en-US/release_notes.txt @@ -1,3 +1,26 @@ +v5.6.7 +====== + +* ADD: coincontrol +* ADD: Handle fiat rate from alternate sources +* ADD: new languages: Bulgarian, Polish, Welsh +* ADD: UYU currency +* FIX: PayJoin is now BIP compliant +* FIX: better support for BRD (aka bread) wallet with segwit +* FIX: Disregarding curent denomination on send screen, scanning address always resets it to BTC +* FIX: import *.txn file with txhex - extra newline characted prevented it from being recognized (closes #2161) +* FIX: locale pt_BR, cs_CZ, sl_SI, es_ES, nl_NL, fi_FI, ru +* FIX: translate message if Bitcoin address or LN invoice is in clipboard +* FIX: Styling for large screens +* FIX: exclude change address from recipients for Confirm screen +* FIX: Dont show loading indicator on launch and onsnapitem +* FIX: Show alert if storage access is denied +* FIX: When wallet card has balance but no txs it displays 'pull to refresh' +* FIX: broken wallet->send->longtap send btn->choose photo +* FIX: Use system color on widgets +* FIX: hide provide entropy button when creating Lightning or MS wallet +* FIX: Can't paste in address block while building tx + v5.6.6 ====== @@ -64,12 +87,3 @@ v5.6.1 * FIX: locales pt_BR, pt_PT, ru, sl_SI, ja_JP * FIX: add margin for RTL languages * FIX: Missing (NT) before $ sign - -v.5.6.0 -======= - -* FIX: some transactions displayed with 0 value -* FIX: PSBT with HW wallets flow -* FIX: rare crash on watch-only receive button -* FIX: RBF cancel style -* REF: updated languages sl_SI, de_DE, fi_FI, es_ES diff --git a/loc/en.json b/loc/en.json index 65d7bea7d..ef2b21281 100644 --- a/loc/en.json +++ b/loc/en.json @@ -314,6 +314,7 @@ "details_inputs": "Inputs", "details_outputs": "Outputs", "details_received": "Received", + "transaction_note_saved":"Transaction note has been successfully saved.", "details_show_in_block_explorer": "View in block explorer", "details_title": "Transaction", "details_to": "Output", diff --git a/loc/sl_SI.json b/loc/sl_SI.json index f5563577a..6d5f15327 100644 --- a/loc/sl_SI.json +++ b/loc/sl_SI.json @@ -107,12 +107,13 @@ "lndViewInvoice": { "additional_info": "Dodatne Informacije", "for": "Za:", + "lightning_invoice": "Lightning Račun", "has_been_paid": "Ta račun je bil plačan", "open_direct_channel": "Odpri neposreden kanal s tem vozliščem:", "please_pay": "Prosim plačajte", "preimage": "Preimage", "sats": "sats", - "wasnt_paid_and_expired": "Ta račun ni bil plačan in je potekel" + "wasnt_paid_and_expired": "Ta račun ni bil plačan in je potekel." }, "plausibledeniability": { "create_fake_storage": "Ustvari Šifrirano shrambo", @@ -358,7 +359,7 @@ "details_display": "prikaži na seznamu denarnic", "details_export_backup": "Izvozi / varnostna kopija", "details_marketplace": "Tržnica", - "details_master_fingerprint": "Master fingerprint", + "details_master_fingerprint": "Glavni prstni odtis (fingerprint)", "details_no_cancel": "Ne, prekliči", "details_save": "Shrani", "details_show_xpub": "Prikaži XPUB denarnice", @@ -455,6 +456,10 @@ "view_edit_cosigners": "Prikaži/uredi sopodpisnike", "this_cosigner_is_already_imported": "Ta sopodpisnik je že uvožen", "export_signed_psbt": "Izvozi podpisano PSBT", + "input_fp": "Vnesite xfp (master key fingerprint)", + "input_fp_explain": "preskoči in uporabi privzetega (00000000)", + "input_path": "Vnesite pot izpeljave (derivation path)", + "input_path_explain": "preskoči in uporabi privzeto ({default})", "view_edit_cosigners_title": "Urejanje sopodpisnikov" }, "cc": { diff --git a/package-lock.json b/package-lock.json index 246d6bf21..e8b2d5a88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "5.6.7", + "version": "5.6.8", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -8306,12 +8306,19 @@ } }, "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", + "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + }, + "dependencies": { + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + } } }, "buffer-alloc": { @@ -18304,6 +18311,15 @@ "yargs": "^13.2.4" }, "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -19184,6 +19200,17 @@ "integrity": "sha512-ToyFSYuJp0/DQ7bXd/vTwF5m3yhNSRngIpVlBFBDccDZQmp2qIo0exrObCNlJLOOHb38dil726hM+GKjR1/60w==", "requires": { "buffer": "^5.4.3" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } } }, "react-native-tooltip": { diff --git a/package.json b/package.json index 876513afb..b33360e8b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "5.6.7", + "version": "5.6.8", "license": "MIT", "devDependencies": { "@babel/core": "^7.10.4", @@ -90,7 +90,7 @@ "bip39": "2.6.0", "bitcoinjs-lib": "5.2.0", "bolt11": "1.2.7", - "buffer": "5.6.0", + "buffer": "6.0.1", "buffer-reverse": "1.0.1", "coinselect": "3.1.12", "crypto-js": "3.1.9-1", diff --git a/screen/receive/details.js b/screen/receive/details.js index 967d4472a..261cec047 100644 --- a/screen/receive/details.js +++ b/screen/receive/details.js @@ -16,11 +16,11 @@ import Share from 'react-native-share'; import Handoff from 'react-native-handoff'; import { - BlueLoadingHook, + BlueLoading, BlueCopyTextToClipboard, BlueButton, SecondButton, - BlueButtonLinkHook, + BlueButtonLink, is, BlueBitcoinAmount, BlueText, @@ -161,7 +161,7 @@ const ReceiveDetails = () => { - + @@ -345,7 +345,7 @@ const ReceiveDetails = () => { url={`https://blockstream.info/address/${address}`} /> )} - {showAddress ? renderReceiveDetails() : } + {showAddress ? renderReceiveDetails() : } ); }; diff --git a/screen/selftest.js b/screen/selftest.js index d5111909f..2ee18d218 100644 --- a/screen/selftest.js +++ b/screen/selftest.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import { ScrollView, View, StyleSheet } from 'react-native'; -import { BlueSpacing20, SafeBlueArea, BlueCard, BlueText, BlueNavigationStyle, BlueLoadingHook } from '../BlueComponents'; +import { BlueSpacing20, SafeBlueArea, BlueCard, BlueText, BlueNavigationStyle, BlueLoading } from '../BlueComponents'; import PropTypes from 'prop-types'; import { SegwitP2SHWallet, LegacyWallet, HDSegwitP2SHWallet, HDSegwitBech32Wallet } from '../class'; import { BlueCurrentTheme } from '../components/themes'; @@ -210,7 +210,7 @@ export default class Selftest extends Component { render() { if (this.state.isLoading) { - return ; + return ; } return ( diff --git a/screen/send/ScanQRCode.js b/screen/send/ScanQRCode.js index 0bd980a71..9229192a6 100644 --- a/screen/send/ScanQRCode.js +++ b/screen/send/ScanQRCode.js @@ -7,7 +7,7 @@ import ImagePicker from 'react-native-image-picker'; import { decodeUR, extractSingleWorkload } from 'bc-ur'; import { useNavigation, useRoute, useIsFocused, useTheme } from '@react-navigation/native'; import loc from '../../loc'; -import { BlueLoadingHook, BlueText, BlueButton, BlueSpacing40 } from '../../BlueComponents'; +import { BlueLoading, BlueText, BlueButton, BlueSpacing40 } from '../../BlueComponents'; import { BlueCurrentTheme } from '../../components/themes'; import { openPrivacyDesktopSettings } from '../../class/camera'; const LocalQRCode = require('@remobile/react-native-qrcode-local-image'); @@ -231,7 +231,7 @@ const ScanQRCode = () => { return isLoading ? ( - + ) : ( diff --git a/screen/send/details.js b/screen/send/details.js index a30c46c34..eba50d1ca 100644 --- a/screen/send/details.js +++ b/screen/send/details.js @@ -647,7 +647,7 @@ export default class SendDetails extends Component { this.props.navigation.navigate('PsbtMultisig', { memo: this.state.memo, psbtBase64: psbt.toBase64(), - walletId: wallet.getID(), + walletID: wallet.getID(), }); this.setState({ isLoading: false }); return; @@ -976,7 +976,7 @@ export default class SendDetails extends Component { this.props.navigation.navigate('PsbtMultisig', { memo: this.state.memo, psbtBase64: psbt.toBase64(), - walletId: fromWallet.getID(), + walletID: fromWallet.getID(), }); } catch (error) { alert(loc.send.problem_with_psbt + ': ' + error.message); diff --git a/screen/send/psbtMultisig.js b/screen/send/psbtMultisig.js index 72c299f91..387cea369 100644 --- a/screen/send/psbtMultisig.js +++ b/screen/send/psbtMultisig.js @@ -1,22 +1,14 @@ /* global alert */ -import React, { useContext, useState } from 'react'; -import { FlatList, Platform, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; -import { BlueButton, BlueButtonLink, BlueCard, BlueNavigationStyle, BlueSpacing20, BlueText, SafeBlueArea } from '../../BlueComponents'; -import { DynamicQRCode } from '../../components/DynamicQRCode'; -import { SquareButton } from '../../components/SquareButton'; -import { getSystemName } from 'react-native-device-info'; +import React, { useContext, useEffect, useState } from 'react'; +import { FlatList, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { BlueButton, BlueCard, BlueNavigationStyle, BlueText, SafeBlueArea } from '../../BlueComponents'; import loc from '../../loc'; import { Icon } from 'react-native-elements'; -import ImagePicker from 'react-native-image-picker'; -import ScanQRCode from './ScanQRCode'; import { useNavigation, useRoute, useTheme } from '@react-navigation/native'; import { BitcoinUnit } from '../../models/bitcoinUnits'; import { BlueStorageContext } from '../../blue_modules/storage-context'; const bitcoin = require('bitcoinjs-lib'); const currency = require('../../blue_modules/currency'); -const fs = require('../../blue_modules/fs'); -const LocalQRCode = require('@remobile/react-native-qrcode-local-image'); -const isDesktop = getSystemName() === 'Mac OS X'; const BigNumber = require('bignumber.js'); const shortenAddress = addr => { @@ -25,21 +17,21 @@ const shortenAddress = addr => { const PsbtMultisig = () => { const { wallets } = useContext(BlueStorageContext); - const navigation = useNavigation(); - const route = useRoute(); + const { navigate, setParams } = useNavigation(); const { colors } = useTheme(); const [flatListHeight, setFlatListHeight] = useState(0); - - const walletId = route.params.walletId; - const psbtBase64 = route.params.psbtBase64; - const memo = route.params.memo; - + const { walletID, psbtBase64, memo, receivedPSBTBase64 } = useRoute().params; + /** @type MultisigHDWallet */ + const wallet = wallets.find(w => w.getID() === walletID); const [psbt, setPsbt] = useState(bitcoin.Psbt.fromBase64(psbtBase64)); - const [isModalVisible, setIsModalVisible] = useState(false); + const data = new Array(wallet.getM()); const stylesHook = StyleSheet.create({ root: { backgroundColor: colors.elevated, }, + whitespace: { + color: colors.elevated, + }, textBtc: { color: colors.buttonAlternativeTextColor, }, @@ -52,18 +44,12 @@ const PsbtMultisig = () => { textDestination: { color: colors.foregroundColor, }, - modalContentShort: { - backgroundColor: colors.elevated, - }, textFiat: { color: colors.alternativeTextColor, }, provideSignatureButton: { backgroundColor: colors.buttonDisabledBackgroundColor, }, - exportButton: { - backgroundColor: colors.buttonDisabledBackgroundColor, - }, provideSignatureButtonText: { color: colors.buttonTextColor, }, @@ -83,8 +69,7 @@ const PsbtMultisig = () => { color: colors.msSuccessBG, }, }); - /** @type MultisigHDWallet */ - const wallet = wallets.find(w => w.getID() === walletId); + let destination = []; let totalSat = 0; const targets = []; @@ -98,23 +83,22 @@ const PsbtMultisig = () => { destination = shortenAddress(destination.join(', ')); const totalBtc = new BigNumber(totalSat).dividedBy(100000000).toNumber(); const totalFiat = currency.satoshiToLocalCurrency(totalSat); - const fileName = `${Date.now()}.psbt`; - - const howManySignaturesWeHave = () => { - return wallet.calculateHowManySignaturesWeHaveFromPsbt(psbt); - }; const getFee = () => { return wallet.calculateFeeFromPsbt(psbt); }; const _renderItem = el => { - if (el.index >= howManySignaturesWeHave()) return _renderItemUnsigned(el); + if (el.index >= howManySignaturesWeHave) return _renderItemUnsigned(el); else return _renderItemSigned(el); }; + const navigateToPSBTMultisigQRCode = () => { + navigate('PsbtMultisigQRCode', { walletID, psbtBase64, isShowOpenScanner: isConfirmEnabled() }); + }; + const _renderItemUnsigned = el => { - const renderProvideSignature = el.index === howManySignaturesWeHave(); + const renderProvideSignature = el.index === howManySignaturesWeHave; return ( @@ -133,9 +117,7 @@ const PsbtMultisig = () => { { - setIsModalVisible(true); - }} + onPress={navigateToPSBTMultisigQRCode} > {loc.multisig.provide_signature} @@ -162,31 +144,25 @@ const PsbtMultisig = () => { ); }; - const _combinePSBT = receivedPSBTBase64 => { + // eslint-disable-next-line react-hooks/exhaustive-deps + useEffect(() => { + if (receivedPSBTBase64) { + _combinePSBT(); + setParams({ receivedPSBTBase64: undefined }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [receivedPSBTBase64]); + + const _combinePSBT = () => { const receivedPSBT = bitcoin.Psbt.fromBase64(receivedPSBTBase64); try { const newPsbt = psbt.combine(receivedPSBT); - navigation.dangerouslyGetParent().pop(); setPsbt(newPsbt); - setIsModalVisible(false); } catch (error) { alert(error); } }; - const onBarScanned = ret => { - if (!ret.data) ret = { data: ret }; - if (ret.data.toUpperCase().startsWith('UR')) { - alert('BC-UR not decoded. This should never happen'); - } else if (ret.data.indexOf('+') === -1 && ret.data.indexOf('=') === -1 && ret.data.indexOf('=') === -1) { - // this looks like NOT base64, so maybe its transaction's hex - // we dont support it in this flow - } else { - // psbt base64? - _combinePSBT(ret.data); - } - }; - const onConfirm = () => { try { psbt.finalizeAllInputs(); @@ -195,7 +171,7 @@ const PsbtMultisig = () => { try { const tx = psbt.extractTransaction().toHex(); const satoshiPerByte = Math.round(getFee() / (tx.length / 2)); - navigation.navigate('Confirm', { + navigate('Confirm', { fee: new BigNumber(getFee()).dividedBy(100000000).toNumber(), memo: memo, fromWallet: wallet, @@ -208,83 +184,20 @@ const PsbtMultisig = () => { } }; - const openScanner = () => { - if (isDesktop) { - ImagePicker.launchCamera( - { - title: null, - mediaType: 'photo', - takePhotoButtonTitle: null, - }, - response => { - if (response.uri) { - const uri = Platform.OS === 'ios' ? response.uri.toString().replace('file://', '') : response.path.toString(); - LocalQRCode.decode(uri, (error, result) => { - if (!error) { - onBarScanned(result); - } else { - alert(loc.send.qr_error_no_qrcode); - } - }); - } else if (response.error) { - ScanQRCode.presentCameraNotAuthorizedAlert(response.error); - } - }, - ); - } else { - navigation.navigate('ScanQRCodeRoot', { - screen: 'ScanQRCode', - params: { - onBarScanned: onBarScanned, - showFileImportButton: true, - }, - }); - } - }; - - const exportPSBT = async () => { - await fs.writeFileAndExport(fileName, psbt.toBase64()); - }; - + const howManySignaturesWeHave = wallet.calculateHowManySignaturesWeHaveFromPsbt(psbt); const isConfirmEnabled = () => { - return howManySignaturesWeHave() >= wallet.getM(); - }; - - const renderDynamicQrCode = () => { - return ( - - - - - {!isConfirmEnabled() && ( - <> - - - - )} - - - - setIsModalVisible(false)} /> - - - - ); + return howManySignaturesWeHave >= wallet.getM(); }; const destinationAddress = () => { // eslint-disable-next-line prefer-const let destinationAddressView = []; + const whitespace = '_'; const destinations = Object.entries(destination.split(',')); for (const [index, address] of destinations) { if (index > 1) { destinationAddressView.push( - + and {destinations.length - 2} more... @@ -297,13 +210,15 @@ const PsbtMultisig = () => { const lastFour = currentAddress.substring(currentAddress.length - 5, currentAddress.length); const middle = currentAddress.split(firstFour)[1].split(lastFour)[0]; destinationAddressView.push( - - - {firstFour} - - {middle} - - {lastFour} + + + + {firstFour} + {whitespace} + {middle} + {whitespace} + {lastFour} + , ); @@ -338,13 +253,10 @@ const PsbtMultisig = () => { ); - if (isModalVisible) return renderDynamicQrCode(); - const onLayout = e => { setFlatListHeight(e.nativeEvent.layout.height); }; - const data = new Array(wallet.getM()); return ( @@ -367,9 +279,7 @@ const PsbtMultisig = () => { { - setIsModalVisible(true); - }} + onPress={navigateToPSBTMultisigQRCode} > {loc.multisig.export_signed_psbt} @@ -422,7 +332,7 @@ const styles = StyleSheet.create({ flexDirection: 'row', justifyContent: 'center', }, - destionationTextContainer: { + destinationTextContainer: { flexDirection: 'row', marginBottom: 4, paddingHorizontal: 60, @@ -438,6 +348,9 @@ const styles = StyleSheet.create({ fontWeight: 'bold', fontSize: 30, }, + textAlignCenter: { + textAlign: 'center', + }, textDestinationFirstFour: { fontSize: 14, }, @@ -447,21 +360,6 @@ const styles = StyleSheet.create({ fontSize: 14, flexWrap: 'wrap', }, - modalContentShort: { - marginLeft: 20, - marginRight: 20, - }, - copyToClipboard: { - justifyContent: 'center', - alignItems: 'center', - }, - exportButton: { - height: 48, - borderRadius: 8, - flex: 1, - justifyContent: 'center', - paddingHorizontal: 16, - }, provideSignatureButton: { marginTop: 24, marginLeft: 40, diff --git a/screen/send/psbtMultisigQRCode.js b/screen/send/psbtMultisigQRCode.js new file mode 100644 index 000000000..21863ea0b --- /dev/null +++ b/screen/send/psbtMultisigQRCode.js @@ -0,0 +1,147 @@ +/* global alert */ +import React, { useState } from 'react'; +import { ActivityIndicator, Platform, ScrollView, StyleSheet, View } from 'react-native'; +import { BlueNavigationStyle, BlueSpacing20, SafeBlueArea } from '../../BlueComponents'; +import { DynamicQRCode } from '../../components/DynamicQRCode'; +import { SquareButton } from '../../components/SquareButton'; +import { getSystemName } from 'react-native-device-info'; +import loc from '../../loc'; +import ImagePicker from 'react-native-image-picker'; +import ScanQRCode from './ScanQRCode'; +import { useNavigation, useRoute, useTheme } from '@react-navigation/native'; +const bitcoin = require('bitcoinjs-lib'); +const fs = require('../../blue_modules/fs'); +const LocalQRCode = require('@remobile/react-native-qrcode-local-image'); +const isDesktop = getSystemName() === 'Mac OS X'; + +const PsbtMultisigQRCode = () => { + const { navigate } = useNavigation(); + const { colors } = useTheme(); + const { psbtBase64, isShowOpenScanner } = useRoute().params; + const [isLoading, setIsLoading] = useState(false); + + const psbt = bitcoin.Psbt.fromBase64(psbtBase64); + const stylesHook = StyleSheet.create({ + root: { + backgroundColor: colors.elevated, + }, + modalContentShort: { + backgroundColor: colors.elevated, + }, + exportButton: { + backgroundColor: colors.buttonDisabledBackgroundColor, + }, + }); + const fileName = `${Date.now()}.psbt`; + + const onBarScanned = ret => { + if (!ret.data) ret = { data: ret }; + if (ret.data.toUpperCase().startsWith('UR')) { + alert('BC-UR not decoded. This should never happen'); + } else if (ret.data.indexOf('+') === -1 && ret.data.indexOf('=') === -1 && ret.data.indexOf('=') === -1) { + // this looks like NOT base64, so maybe its transaction's hex + // we dont support it in this flow + } else { + // psbt base64? + navigate('PsbtMultisig', { receivedPSBTBase64: ret.data }); + } + }; + + const openScanner = () => { + if (isDesktop) { + ImagePicker.launchCamera( + { + title: null, + mediaType: 'photo', + takePhotoButtonTitle: null, + }, + response => { + if (response.uri) { + const uri = Platform.OS === 'ios' ? response.uri.toString().replace('file://', '') : response.path.toString(); + LocalQRCode.decode(uri, (error, result) => { + if (!error) { + onBarScanned(result); + } else { + alert(loc.send.qr_error_no_qrcode); + } + }); + } else if (response.error) { + ScanQRCode.presentCameraNotAuthorizedAlert(response.error); + } + }, + ); + } else { + navigate('ScanQRCodeRoot', { + screen: 'ScanQRCode', + params: { + onBarScanned: onBarScanned, + showFileImportButton: true, + }, + }); + } + }; + + const exportPSBT = () => { + setIsLoading(true); + setTimeout(() => fs.writeFileAndExport(fileName, psbt.toBase64()).finally(() => setIsLoading(false)), 10); + }; + + return ( + + + + + {!isShowOpenScanner && ( + <> + + + + )} + + {isLoading ? ( + + ) : ( + + )} + + + + ); +}; + +const styles = StyleSheet.create({ + root: { + flex: 1, + }, + scrollViewContent: { + flexGrow: 1, + justifyContent: 'space-between', + }, + modalContentShort: { + marginLeft: 20, + marginRight: 20, + }, + copyToClipboard: { + justifyContent: 'center', + alignItems: 'center', + }, + exportButton: { + height: 48, + borderRadius: 8, + flex: 1, + justifyContent: 'center', + paddingHorizontal: 16, + }, +}); + +PsbtMultisigQRCode.navigationOptions = () => ({ + ...BlueNavigationStyle(null, false), + title: loc.multisig.header, +}); + +export default PsbtMultisigQRCode; diff --git a/screen/send/success.js b/screen/send/success.js index cd7a9602a..6a36363c3 100644 --- a/screen/send/success.js +++ b/screen/send/success.js @@ -15,7 +15,7 @@ const Success = () => { }; const { colors } = useTheme(); const { dangerouslyGetParent } = useNavigation(); - const { amount = 0, fee = 0, amountUnit = BitcoinUnit.BTC, invoiceDescription = '', onDonePressed = pop } = useRoute().params; + const { amount, fee, amountUnit = BitcoinUnit.BTC, invoiceDescription = '', onDonePressed = pop } = useRoute().params; const stylesHook = StyleSheet.create({ root: { backgroundColor: colors.elevated, @@ -76,10 +76,12 @@ export const SuccessView = ({ amount, amountUnit, fee, invoiceDescription, shoul - <> - {amount} - {' ' + amountUnit} - + {amount && ( + <> + {amount} + {' ' + amountUnit} + + )} {fee > 0 && ( diff --git a/screen/settings/encryptStorage.js b/screen/settings/encryptStorage.js index d7f2a2c1b..6072f6a69 100644 --- a/screen/settings/encryptStorage.js +++ b/screen/settings/encryptStorage.js @@ -4,7 +4,7 @@ import { ScrollView, Alert, Platform, TouchableOpacity, TouchableWithoutFeedback import { useNavigation } from '@react-navigation/native'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import { - BlueLoadingHook, + BlueLoading, SafeBlueArea, BlueSpacing20, BlueCard, @@ -149,7 +149,7 @@ const EncryptStorage = () => { return isLoading ? ( - + ) : ( diff --git a/screen/settings/language.js b/screen/settings/language.js index 9558e5d2f..88117a650 100644 --- a/screen/settings/language.js +++ b/screen/settings/language.js @@ -1,6 +1,6 @@ import React, { useState, useEffect, useCallback } from 'react'; import { FlatList, StyleSheet } from 'react-native'; -import { SafeBlueArea, BlueListItem, BlueCard, BlueLoadingHook, BlueNavigationStyle, BlueText } from '../../BlueComponents'; +import { SafeBlueArea, BlueListItem, BlueCard, BlueLoading, BlueNavigationStyle, BlueText } from '../../BlueComponents'; import { AvailableLanguages } from '../../loc/languages'; import loc from '../../loc'; @@ -40,7 +40,7 @@ const Language = () => { ); return isLoading ? ( - + ) : ( `${index}`} data={AvailableLanguages} renderItem={renderItem} /> diff --git a/screen/settings/licensing.js b/screen/settings/licensing.js index d1fd9753c..2c35636c9 100644 --- a/screen/settings/licensing.js +++ b/screen/settings/licensing.js @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; import { ScrollView, StyleSheet } from 'react-native'; -import { SafeBlueArea, BlueCard, BlueText, BlueNavigationStyle, BlueSpacing20, BlueLoadingHook } from '../../BlueComponents'; +import { SafeBlueArea, BlueCard, BlueText, BlueNavigationStyle, BlueSpacing20, BlueLoading } from '../../BlueComponents'; /** @type {AppStorage} */ const styles = StyleSheet.create({ @@ -17,7 +17,7 @@ const Licensing = () => { }, []); return isLoading ? ( - + ) : ( diff --git a/screen/settings/lightningSettings.js b/screen/settings/lightningSettings.js index d64614704..25b94986e 100644 --- a/screen/settings/lightningSettings.js +++ b/screen/settings/lightningSettings.js @@ -11,7 +11,7 @@ import { SafeBlueArea, BlueCard, BlueNavigationStyle, - BlueLoadingHook, + BlueLoading, BlueText, BlueButtonLink, } from '../../BlueComponents'; @@ -130,7 +130,7 @@ const LightningSettings = () => { - {isLoading ? : } + {isLoading ? : } ); diff --git a/screen/transactions/details.js b/screen/transactions/details.js index 9628d3c03..2dd24d3b8 100644 --- a/screen/transactions/details.js +++ b/screen/transactions/details.js @@ -1,5 +1,5 @@ /* global alert */ -import React, { Component } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import { View, ScrollView, TouchableOpacity, Text, TextInput, Linking, StatusBar, StyleSheet, Keyboard } from 'react-native'; import { SafeBlueArea, @@ -12,12 +12,227 @@ import { } from '../../BlueComponents'; import HandoffSettings from '../../class/handoff'; import Handoff from 'react-native-handoff'; -import PropTypes from 'prop-types'; import loc from '../../loc'; -import { BlueCurrentTheme } from '../../components/themes'; import { BlueStorageContext } from '../../blue_modules/storage-context'; +import { useNavigation, useRoute, useTheme } from '@react-navigation/native'; const dayjs = require('dayjs'); +function onlyUnique(value, index, self) { + return self.indexOf(value) === index; +} + +function arrDiff(a1, a2) { + const ret = []; + for (const v of a2) { + if (a1.indexOf(v) === -1) { + ret.push(v); + } + } + return ret; +} + +const TransactionsDetails = () => { + const { setOptions } = useNavigation(); + const { hash } = useRoute().params; + const { saveToDisk, txMetadata, wallets, getTransactions } = useContext(BlueStorageContext); + const [isHandOffUseEnabled, setIsHandOffUseEnabled] = useState(false); + const [from, setFrom] = useState(); + const [to, setTo] = useState(); + const [isLoading, setIsLoading] = useState(true); + const [tx, setTX] = useState(); + const [memo, setMemo] = useState(); + const { colors } = useTheme(); + const stylesHooks = StyleSheet.create({ + rowCaption: { + color: colors.foregroundColor, + }, + txId: { + color: colors.foregroundColor, + }, + txLink: { + color: colors.alternativeTextColor2, + }, + saveText: { + color: colors.alternativeTextColor2, + }, + memoTextInput: { + borderColor: colors.formBorder, + borderBottomColor: colors.formBorder, + backgroundColor: colors.inputBackgroundColor, + }, + }); + + useEffect(() => { + setOptions({ + headerRight: () => ( + + {loc.wallets.details_save} + + ), + headerStyle: { + borderBottomWidth: 0, + elevation: 0, + shadowOpacity: 0, + shadowOffset: { height: 0, width: 0 }, + backgroundColor: colors.customHeader, + }, + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [colors, isLoading, memo]); + + useEffect(() => { + let foundTx = {}; + let from = []; + let to = []; + for (const tx of getTransactions()) { + if (tx.hash === hash) { + foundTx = tx; + for (const input of foundTx.inputs) { + from = from.concat(input.addresses); + } + for (const output of foundTx.outputs) { + if (output.addresses) to = to.concat(output.addresses); + if (output.scriptPubKey && output.scriptPubKey.addresses) to = to.concat(output.scriptPubKey.addresses); + } + } + } + + for (const w of wallets) { + for (const t of w.getTransactions()) { + if (t.hash === hash) { + console.log('tx', hash, 'belongs to', w.getLabel()); + } + } + } + if (txMetadata[foundTx.hash]) { + if (txMetadata[foundTx.hash].memo) { + setMemo(txMetadata[foundTx.hash].memo); + } + } + + setTX(foundTx); + setFrom(from); + setTo(to); + setIsLoading(false); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [hash]); + + useEffect(() => { + HandoffSettings.isHandoffUseEnabled().then(setIsHandOffUseEnabled); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const handleOnSaveButtonTapped = () => { + Keyboard.dismiss(); + txMetadata[tx.hash] = { memo }; + saveToDisk().then(_success => alert(loc.transactions.transaction_note_saved)); + }; + + const handleOnOpenTransactionOnBlockExporerTapped = () => { + const url = `https://blockstream.info/tx/${tx.hash}`; + Linking.canOpenURL(url).then(supported => { + if (supported) { + Linking.openURL(url); + } + }); + }; + + if (isLoading || !tx) { + return ; + } + + return ( + + {isHandOffUseEnabled && ( + + )} + + + + + + + + + {from && ( + <> + + {loc.transactions.details_from} + + + {from.filter(onlyUnique).join(', ')} + + )} + + {to && ( + <> + + {loc.transactions.details_to} + + + {arrDiff(from, to.filter(onlyUnique)).join(', ')} + + )} + + {tx.fee && ( + <> + {loc.send.create_fee} + {tx.fee + ' sats'} + + )} + + {tx.hash && ( + <> + + Txid + + + {tx.hash} + + {loc.transactions.details_show_in_block_explorer} + + + )} + + {tx.received && ( + <> + {loc.transactions.details_received} + {dayjs(tx.received).format('MM/DD/YYYY h:mm A')} + + )} + + {tx.block_height > 0 && ( + <> + {loc.transactions.details_block} + {tx.block_height} + + )} + + {tx.inputs && ( + <> + {loc.transactions.details_inputs} + {tx.inputs.length} + + )} + + {tx.outputs.length > 0 && ( + <> + {loc.transactions.details_outputs} + {tx.outputs.length} + + )} + + + + ); +}; + const styles = StyleSheet.create({ root: { flex: 1, @@ -35,7 +250,6 @@ const styles = StyleSheet.create({ fontSize: 16, fontWeight: '500', marginBottom: 4, - color: BlueCurrentTheme.colors.foregroundColor, }, rowValue: { marginBottom: 26, @@ -44,7 +258,6 @@ const styles = StyleSheet.create({ txId: { fontSize: 16, fontWeight: '500', - color: BlueCurrentTheme.colors.foregroundColor, }, txHash: { marginBottom: 8, @@ -52,23 +265,16 @@ const styles = StyleSheet.create({ }, txLink: { marginBottom: 26, - color: BlueCurrentTheme.colors.alternativeTextColor2, }, save: { marginHorizontal: 16, justifyContent: 'center', alignItems: 'center', }, - saveText: { - color: BlueCurrentTheme.colors.alternativeTextColor2, - }, memoTextInput: { flexDirection: 'row', - borderColor: BlueCurrentTheme.colors.formBorder, - borderBottomColor: BlueCurrentTheme.colors.formBorder, borderWidth: 1, borderBottomWidth: 0.5, - backgroundColor: BlueCurrentTheme.colors.inputBackgroundColor, minHeight: 44, height: 44, alignItems: 'center', @@ -79,221 +285,9 @@ const styles = StyleSheet.create({ }, }); -function onlyUnique(value, index, self) { - return self.indexOf(value) === index; -} +export default TransactionsDetails; -function arrDiff(a1, a2) { - const ret = []; - for (const v of a2) { - if (a1.indexOf(v) === -1) { - ret.push(v); - } - } - return ret; -} - -export default class TransactionsDetails extends Component { - static contextType = BlueStorageContext; - - constructor(props, context) { - super(props); - const hash = props.route.params.hash; - let foundTx = {}; - let from = []; - let to = []; - for (const tx of context.getTransactions()) { - if (tx.hash === hash) { - foundTx = tx; - for (const input of foundTx.inputs) { - from = from.concat(input.addresses); - } - for (const output of foundTx.outputs) { - if (output.addresses) to = to.concat(output.addresses); - if (output.scriptPubKey && output.scriptPubKey.addresses) to = to.concat(output.scriptPubKey.addresses); - } - } - } - - let wallet = false; - for (const w of context.wallets) { - for (const t of w.getTransactions()) { - if (t.hash === hash) { - console.log('tx', hash, 'belongs to', w.getLabel()); - wallet = w; - } - } - } - let memo = ''; - if (context.txMetadata[foundTx.hash]) { - if (context.txMetadata[foundTx.hash].memo) { - memo = context.txMetadata[foundTx.hash].memo; - } - } - this.state = { - isLoading: true, - tx: foundTx, - from, - to, - wallet, - isHandOffUseEnabled: false, - memo, - }; - } - - async componentDidMount() { - console.log('transactions/details - componentDidMount'); - this.props.navigation.setParams({ handleOnSaveButtonTapped: this.handleOnSaveButtonTapped }); - const isHandOffUseEnabled = await HandoffSettings.isHandoffUseEnabled(); - this.setState({ - isLoading: false, - isHandOffUseEnabled, - }); - } - - handleOnSaveButtonTapped = () => { - Keyboard.dismiss(); - this.context.txMetadata[this.state.tx.hash] = { memo: this.state.memo }; - this.context.saveToDisk().then(_success => alert('Transaction note has been successfully saved.')); - }; - - handleOnMemoChangeText = value => { - this.setState({ memo: value }); - }; - - render() { - if (this.state.isLoading || !('tx' in this.state)) { - return ; - } - - return ( - - {this.state.isHandOffUseEnabled && ( - - )} - - - - - - - - - {'from' in this.state && ( - <> - - {loc.transactions.details_from} - - - {this.state.from.filter(onlyUnique).join(', ')} - - )} - - {'to' in this.state && ( - <> - - {loc.transactions.details_to} - - - {arrDiff(this.state.from, this.state.to.filter(onlyUnique)).join(', ')} - - )} - - {'fee' in this.state.tx && ( - <> - {loc.send.create_fee} - {this.state.tx.fee + ' sats'} - - )} - - {'hash' in this.state.tx && ( - <> - - Txid - - - {this.state.tx.hash} - { - const url = `https://blockstream.info/tx/${this.state.tx.hash}`; - Linking.canOpenURL(url).then(supported => { - if (supported) { - Linking.openURL(url); - } - }); - }} - > - {loc.transactions.details_show_in_block_explorer} - - - )} - - {'received' in this.state.tx && ( - <> - {loc.transactions.details_received} - {dayjs(this.state.tx.received).format('MM/DD/YYYY h:mm A')} - - )} - - {'block_height' in this.state.tx && this.state.tx.block_height > 0 && ( - <> - {loc.transactions.details_block} - {this.state.tx.block_height} - - )} - - {'inputs' in this.state.tx && ( - <> - {loc.transactions.details_inputs} - {this.state.tx.inputs.length} - - )} - - {'outputs' in this.state.tx && this.state.tx.outputs.length > 0 && ( - <> - {loc.transactions.details_outputs} - {this.state.tx.outputs.length} - - )} - - - - ); - } -} - -TransactionsDetails.propTypes = { - route: PropTypes.shape({ - name: PropTypes.string, - params: PropTypes.shape({ - hash: PropTypes.string, - }), - }), - navigation: PropTypes.shape({ - setParams: PropTypes.func, - }), -}; - -TransactionsDetails.navigationOptions = ({ navigation, route }) => ({ +TransactionsDetails.navigationOptions = () => ({ ...BlueNavigationStyle(), title: loc.transactions.details_title, - headerStyle: { - ...BlueNavigationStyle().headerStyle, - backgroundColor: BlueCurrentTheme.colors.customHeader, - }, - headerRight: () => ( - - {loc.wallets.details_save} - - ), }); diff --git a/screen/wallets/add.js b/screen/wallets/add.js index 4e7d6428d..26efa15b7 100644 --- a/screen/wallets/add.js +++ b/screen/wallets/add.js @@ -22,7 +22,7 @@ import { BlueFormLabel, BlueButton, BlueNavigationStyle, - BlueButtonLinkHook, + BlueButtonLink, BlueSpacing20, } from '../../BlueComponents'; import { HDSegwitBech32Wallet, SegwitP2SHWallet, HDSegwitP2SHWallet, LightningCustodianWallet, AppStorage } from '../../class'; @@ -310,7 +310,7 @@ const WalletsAdd = () => { } })()} {isAdvancedOptionsEnabled && selectedWalletType === ButtonSelected.ONCHAIN && !isLoading && ( - + )} @@ -321,7 +321,7 @@ const WalletsAdd = () => { )} {!isLoading && ( - { if (cosignersCopy.length === n) setIsOnCreateButtonEnabled(true); setIsProvideMnemonicsModalVisible(false); setIsLoading(false); + setImportText(''); + }; + + const isValidMnemonicSeed = mnemonicSeed => { + const hd = new HDSegwitBech32Wallet(); + hd.setSecret(mnemonicSeed); + return hd.validateMnemonic(); }; const onBarScanned = ret => { @@ -298,6 +305,9 @@ const WalletsAddMultisigStep2 = () => { if (!ret.data) ret = { data: ret }; if (ret.data.toUpperCase().startsWith('UR')) { alert('BC-UR not decoded. This should never happen'); + } else if (isValidMnemonicSeed(ret.data)) { + setIsProvideMnemonicsModalVisible(true); + setImportText(ret.data); } else { let cosigner = new MultisigCosigner(ret.data); if (!cosigner.isValid()) return alert(loc.multisig.invalid_cosigner); @@ -572,7 +582,7 @@ const WalletsAddMultisigStep2 = () => { ) : ( )} - + @@ -620,7 +630,7 @@ const WalletsAddMultisigStep2 = () => { ); }; const footer = isLoading ? ( - + ) : ( diff --git a/screen/wallets/details.js b/screen/wallets/details.js index 295af51a2..8afa1392f 100644 --- a/screen/wallets/details.js +++ b/screen/wallets/details.js @@ -16,7 +16,7 @@ import { StatusBar, PermissionsAndroid, } from 'react-native'; -import { SecondButton, SafeBlueArea, BlueCard, BlueSpacing20, BlueNavigationStyle, BlueText, BlueLoadingHook } from '../../BlueComponents'; +import { SecondButton, SafeBlueArea, BlueCard, BlueSpacing20, BlueNavigationStyle, BlueText, BlueLoading } from '../../BlueComponents'; import { LightningCustodianWallet } from '../../class/wallets/lightning-custodian-wallet'; import { HDLegacyBreadwalletWallet } from '../../class/wallets/hd-legacy-breadwallet-wallet'; import { HDLegacyP2PKHWallet } from '../../class/wallets/hd-legacy-p2pkh-wallet'; @@ -368,7 +368,7 @@ const WalletDetails = () => { return isLoading ? ( - + ) : ( diff --git a/screen/wallets/transactions.js b/screen/wallets/transactions.js index a614f612b..21a792d07 100644 --- a/screen/wallets/transactions.js +++ b/screen/wallets/transactions.js @@ -140,6 +140,15 @@ const WalletTransactions = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [walletID]); + // if balance of the wallet positive and there are no transactions, then + // it'a freshly impoted wallet and we need to refresh transactions + useEffect(() => { + if (dataSource.length === 0 && wallet.current.getBalance() > 0) { + refreshTransactions(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + // if description of transaction has been changed we want to show new one useFocusEffect( useCallback(() => { diff --git a/screen/wallets/viewEditMultisigCosigners.js b/screen/wallets/viewEditMultisigCosigners.js index 019e01860..6682e5db3 100644 --- a/screen/wallets/viewEditMultisigCosigners.js +++ b/screen/wallets/viewEditMultisigCosigners.js @@ -22,9 +22,9 @@ import ImagePicker from 'react-native-image-picker'; import { BlueButton, - BlueButtonLinkHook, + BlueButtonLink, BlueFormMultiInput, - BlueLoadingHook, + BlueLoading, BlueNavigationStyle, BlueSpacing10, BlueSpacing20, @@ -441,7 +441,7 @@ const ViewEditMultisigCosigners = () => { onPress={handleUseMnemonicPhrase} /> )} - + @@ -451,7 +451,7 @@ const ViewEditMultisigCosigners = () => { if (isLoading) return ( - + ); diff --git a/scripts/edit-version-number.sh b/scripts/edit-version-number.sh index 53d7a366c..cc8a4cc2b 100755 --- a/scripts/edit-version-number.sh +++ b/scripts/edit-version-number.sh @@ -1,12 +1,4 @@ -vim ios/BlueWallet/Info.plist -vim ios/BlueWalletWatch/Info.plist -vim "ios/BlueWalletWatch Extension/Info.plist" -vim "ios/TodayExtension/Info.plist" vim ios/BlueWallet.xcodeproj/project.pbxproj -vim ios/WalletInformationWidget/Widgets/MarketWidget/Info.plist -vim ios/WalletInformationWidget/Widgets/WalletInformationAndMarketWidget/Info.plist -vim ios/WalletInformationWidget/Info.plist -vim ios/WalletInformationWidget/Widgets/PriceWidget/Info.plist vim android/app/build.gradle vim package.json vim package-lock.json