ton_sdk_client 1.16.1 → 1.20.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 622e37887180cee84b905ded176e40e785e5cd776b57f5ca47190a16113e429b
4
- data.tar.gz: af8e2218ea8112ac0133f36bb87a32a535c15192f86ef815d00cc1386eddf2e6
3
+ metadata.gz: b2505e8728fde891a77e7ba520d4d465757220891c03731b685b632963508154
4
+ data.tar.gz: 29dc859c271d8534e04d9de0464d78b2d773db8dce304fdc1ab56a59428644e4
5
5
  SHA512:
6
- metadata.gz: 5e04c5d81a9aea2f7e7690f95fab69126fed54ae808ae7500d4504b7846adb7659047c8f092cbcdcc507ba49e256198b42ef4c2673b7dbc7e787dae334dd7036
7
- data.tar.gz: ad6100613644e18d0c6ce35fbb88c05c0cacc72dde99454cb978cb5a5ef1a09663bc89702edd80f1e8610fb192c32d17a3bef8cc46843ba172e7d7e01ec22fe6
6
+ metadata.gz: 9183bc4f29e8a6b17cd9985ffb7dbab5508b0a5ca8a46afc7d049e602cc20c51d5d2bc39e39ef5b262a1d38946e12bd7ca78945db4cb1bc7fc46e4ff8a26d6b5
7
+ data.tar.gz: b7421f58b1a8efa63fe36bba7e5fd55cdfd3e6b5171575c81136f4a506678df09f1aef4e025f3848a8ccd5d6927f417affd8ac03b26de9ce874d96701d885079
data/CHANGELOG.md CHANGED
@@ -1,88 +1,37 @@
1
1
  # Changelog
2
2
 
3
- 1.16.x
3
+ all the changes are always according to the ones of the main TON SDK library; and on top on that, there may be additional ones
4
+
5
+ 1.20.x
4
6
  -----
5
- * TON SDK version: 1.16.0
6
- * the changes are according the ones of TON SDK
7
+ * NetworkConfig and AbiContract have been changed (not mentioned explicitly in Changelog of TON SDK )
8
+
7
9
 
8
10
  1.15.x
9
11
  -----
10
- * TON SDK version: 1.15.0
11
12
  * internal refactoring
12
- * the changes are according the ones of TON SDK
13
+
13
14
 
14
15
  1.13.x
15
16
  -----
16
- * TON SDK version: 1.13.0
17
17
  * internal refactoring
18
- * the changes are according the ones of TON SDK
18
+
19
19
 
20
20
  1.12.x
21
21
  -----
22
- * TON SDK version: 1.12.0
23
22
  * internal refactoring
24
- * the changes are according the ones of TON SDK
25
-
26
- 1.11.x
27
- -----
28
- * TON SDK version: 1.11.0
29
- * the changes are according the ones of TON SDK
30
-
31
-
32
- 1.10.x
33
- -----
34
- * TON SDK version: 1.10.0
35
- * the changes are according the ones of TON SDK
36
23
 
37
24
 
38
25
  1.9.x
39
26
  -----
40
- * TON SDK version: 1.9.0
41
27
  * remove TonSdk::NATIVE_LIB_VERSION, rename TonSdk::SDK_VERSION to TonSdk::NATIVE_SDK_VERSION
42
- * the changes are according the ones of TON SDK
43
28
 
44
29
 
45
- 1.7.x
46
- -----
47
- * TON SDK version: 1.7.0
48
- * the changes are according the ones of TON SDK
49
-
50
- 1.3.x
51
- -----
52
- * TON SDK version: 1.6.0
53
- * the changes are according the ones of TON SDK
54
-
55
30
  1.2.x
56
31
  -----
57
- * TON SDK version: 1.5.2
58
32
  * min Ruby version: 3.0
59
33
 
60
34
 
61
- 1.1.x
62
- -----
63
- * new `Client` `.resolve_app_request()`
64
- * new `Net` `.query()`, `.suspend()`, `.resume()`
65
- * new `Debot`
66
- * new `Boc` `.get_boc_hash()`
67
- * new `Crypto` `.register_signing_box()`, `.get_signing_box()`, `.signing_box_get_public_key()`,
68
- `.signing_box_sign()`, `remove_signing_box()`
69
- * new paramentes in `NetworkConfig`; particularly
70
-
71
- ```
72
- server_address: "example.com"
73
- ```
74
-
75
- becomes
76
-
77
- ```
78
- endpoints: ["example.com"]
79
- ```
80
-
81
- check out the main repository for the details
82
-
83
- * new data types/classes in several modules
84
-
85
-
86
35
  1.0.0
87
36
  -----
88
- * The first version has been released.
37
+ * the first version has been released.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # TON SDK client in Ruby and for Ruby
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/ton_sdk_client.png)](https://badge.fury.io/rb/ton_sdk_client)
4
- [![TON SDK version](https://img.shields.io/badge/TON%20SDK%20version-1.16.1-green)](https://github.com/tonlabs/TON-SDK/tree/1.16.1)
4
+ [![TON SDK version](https://img.shields.io/badge/TON%20SDK%20version-1.20.0-green)](https://github.com/tonlabs/TON-SDK/tree/1.20.0)
5
5
 
6
6
  Ruby gem-client bindings for [TON SDK](https://github.com/tonlabs/TON-SDK) which allows one to communicate with [FreeTON](https://freeton.org) blockchain in Ruby.
7
7
 
@@ -9,7 +9,7 @@ Note that there're 2 types of versions:
9
9
  * `TonSdk::VERSION` - the version of the gem
10
10
  * `TonSdk::NATIVE_SDK_VERSION` - the version of the original SDK
11
11
 
12
- and they don't necessarily have to match each other.
12
+ and they may not always match each other.
13
13
 
14
14
 
15
15
 
@@ -549,43 +549,36 @@ module TonSdk
549
549
  end
550
550
 
551
551
  class AbiContract
552
- attr_reader :abi_version, :header, :functions, :events, :data
552
+ attr_reader :abi_version, :version, :header, :functions, :events, :data, :fields
553
553
 
554
- def initialize(abi_version: nil, header: [], functions: [], events: [], data: [])
554
+ def initialize(
555
+ abi_version: nil,
556
+ version: nil,
557
+ header: [],
558
+ functions: [],
559
+ events: [],
560
+ data: [],
561
+ fields: []
562
+ )
555
563
  @abi_version = abi_version
556
-
557
- # in case if an argument has been passed as nil,
558
- # a default value should be used instead
559
-
560
- @header = header || []
561
- @functions = functions || []
562
- @events = events || []
563
- @data = data || []
564
+ @version = version
565
+ @header = header
566
+ @functions = functions
567
+ @events = events
568
+ @data = data
569
+ @fields = fields
564
570
  end
565
571
 
566
572
  def to_h
567
- @header.compact! if !@header.nil?
568
-
569
- fn_h_s = if !@functions.nil?
570
- @functions.compact.map(&:to_h)
571
- end
572
-
573
- ev_h_s = if !@events.nil?
574
- @events.compact.map(&:to_h)
575
- end
576
-
577
- dt_h_s = if !@data.nil?
578
- @data.compact.map(&:to_h)
579
- end
580
-
581
573
  {
582
574
  abi_version: @abi_version,
583
575
  :"ABI version" => @abi_version, #TODO
584
-
576
+ version: @version,
585
577
  header: @header,
586
- functions: fn_h_s,
587
- events: ev_h_s,
588
- data: dt_h_s,
578
+ functions: @functions&.map(&:to_h),
579
+ events: @events&.map(&:to_h),
580
+ data: @data&.map(&:to_h),
581
+ fields: @fields&.map(&:to_h)
589
582
  }
590
583
  end
591
584
 
@@ -610,12 +603,20 @@ module TonSdk
610
603
  j["data"].compact.map {|x| AbiData.from_json(x) }
611
604
  end
612
605
 
606
+ fl_s = if j["fields"].nil?
607
+ []
608
+ else
609
+ j["fields"].compact.map {|x| AbiParam.from_json(x) }
610
+ end
611
+
613
612
  self.new(
614
613
  abi_version: j["ABI version"],
614
+ version: j["version"],
615
615
  header: j["header"],
616
616
  functions: fn_s,
617
617
  events: ev_s,
618
- data: dt_s
618
+ data: dt_s,
619
+ fields: fl_s
619
620
  )
620
621
  end
621
622
  end
@@ -656,6 +657,9 @@ module TonSdk
656
657
  end
657
658
  end
658
659
 
660
+ ParamsOfDecodeAccountData = Struct.new(:abi, :data, keyword_init: true)
661
+ ResultOfDecodeData = Struct.new(:data)
662
+
659
663
 
660
664
  #
661
665
  # functions
@@ -772,5 +776,22 @@ module TonSdk
772
776
  end
773
777
  end
774
778
  end
779
+
780
+ def self.decode_account_data(ctx, params)
781
+ Interop::request_to_native_lib(ctx, "abi.decode_account_data", params) do |resp|
782
+ if resp.success?
783
+ yield NativeLibResponsetResult.new(
784
+ result: ResultOfDecodeData.new(
785
+ resp.result["data"]
786
+ )
787
+ )
788
+ else
789
+ yield resp
790
+ end
791
+ end
792
+ end
793
+
794
+
795
+
775
796
  end
776
797
  end
@@ -42,6 +42,7 @@ module TonSdk
42
42
  UNEXPECTED_CALLBACK_RESPONSE = 31
43
43
  CANNOT_PARSE_NUMBER = 32
44
44
  INTERNAL_ERROR = 33
45
+ INVALID_HANDLE = 34
45
46
  end
46
47
 
47
48
  ResultOfVersion = Struct.new(:version)
@@ -5,15 +5,16 @@ module TonSdk
5
5
  :server_address,
6
6
  :endpoints,
7
7
  :network_retries_count,
8
+ :max_reconnect_timeout,
9
+ :reconnect_timeout,
8
10
  :message_retries_count,
9
11
  :message_processing_timeout,
10
12
  :wait_for_timeout,
11
13
  :out_of_sync_threshold,
12
- :reconnect_timeout,
13
- :max_reconnect_timeout,
14
14
  :sending_endpoint_count,
15
15
  :latency_detection_interval,
16
16
  :max_latency,
17
+ :query_timeout,
17
18
  :access_key,
18
19
  keyword_init: true
19
20
  ) do
@@ -30,6 +31,7 @@ module TonSdk
30
31
  sending_endpoint_count: 2,
31
32
  latency_detection_interval: 60000,
32
33
  max_latency: 60000,
34
+ query_timeout: 60000,
33
35
  access_key: nil
34
36
  )
35
37
  super
@@ -265,6 +265,11 @@ module TonSdk
265
265
  end
266
266
  end
267
267
 
268
+ EncryptionBoxInfo = Struct.new(:hdpath, :algorithm, :options, :public, keyword_init: true)
269
+ ParamsOfEncryptionBoxGetInfo = Struct.new(:encryption_box)
270
+ ResultOfEncryptionBoxGetInfo = Struct.new(:info)
271
+ RegisteredEncryptionBox = Struct.new(:handle)
272
+
268
273
 
269
274
  #
270
275
  # functions
@@ -762,5 +767,57 @@ module TonSdk
762
767
  end
763
768
  end
764
769
  end
770
+
771
+ def self.register_encryption_box(ctx, app_obj:)
772
+ client_callback = Proc.new do |type_, x|
773
+ app_res = app_obj.request(x["request_data"])
774
+ app_req_result = case app_res
775
+ in [:success, result]
776
+ TonSdk::Client::AppRequestResult.new(
777
+ type_: :ok,
778
+ result: result
779
+ )
780
+ in [:error, text]
781
+ TonSdk::Client::AppRequestResult.new(
782
+ type_: :error,
783
+ text: text
784
+ )
785
+ end
786
+
787
+ params = TonSdk::Client::ParamsOfResolveAppRequest.new(
788
+ app_request_id: x["app_request_id"],
789
+ result: app_req_result
790
+ )
791
+ TonSdk::Client.resolve_app_request(ctx, params)
792
+ end
793
+
794
+ Interop::request_to_native_lib(
795
+ ctx,
796
+ "crypto.register_encryption_box",
797
+ nil,
798
+ client_callback: client_callback,
799
+ is_single_thread_only: false
800
+ ) do |resp|
801
+ if resp.success?
802
+ yield NativeLibResponsetResult.new(
803
+ result: RegisteredEncryptionBox.new(resp.result["handle"])
804
+ )
805
+ else
806
+ yield resp
807
+ end
808
+ end
809
+ end
810
+
811
+ def self.encryption_box_get_info(ctx, params)
812
+ Interop::request_to_native_lib(ctx, "crypto.encryption_box_get_info", params) do |resp|
813
+ if resp.success?
814
+ yield NativeLibResponsetResult.new(
815
+ result: ResultOfEncryptionBoxGetInfo.new(resp.result["info"])
816
+ )
817
+ else
818
+ yield resp
819
+ end
820
+ end
821
+ end
765
822
  end
766
823
  end
@@ -228,9 +228,28 @@ module TonSdk
228
228
  h
229
229
  end
230
230
  end
231
-
232
231
  ResultOfQueryTransactionTree = Struct.new(:messages, :transactions, keyword_init: true)
233
232
 
233
+ ParamsOfCreateBlockIterator = Struct.new(:start_time, :end_time, :shard_filter, :result, keyword_init: true)
234
+ RegisteredIterator = Struct.new(:handle)
235
+ ParamsOfResumeBlockIterator = Struct.new(:resume_state)
236
+ ParamsOfCreateTransactionIterator = Struct.new(:start_time, :end_time, :shard_filter, :accounts_filter, :result, :include_transfers, keyword_init: true)
237
+ ParamsOfResumeTransactionIterator = Struct.new(:resume_state, :accounts_filter, keyword_init: true) do
238
+ def initialize(resume_state:, accounts_filter: nil)
239
+ super
240
+ end
241
+ end
242
+ ParamsOfIteratorNext = Struct.new(:iterator, :limit, :return_resume_state, keyword_init: true) do
243
+ def initialize(iterator:, limit: nil, return_resume_state: nil)
244
+ super
245
+ end
246
+ end
247
+ ResultOfIteratorNext = Struct.new(:items, :has_more, :resume_state, keyword_init: true) do
248
+ def initialize(items: [], has_more:, resume_state: nil)
249
+ super
250
+ end
251
+ end
252
+
234
253
 
235
254
  #
236
255
  # functions
@@ -367,71 +386,148 @@ module TonSdk
367
386
  end
368
387
  end
369
388
  end
370
- end
371
389
 
372
- def self.batch_query(ctx, params)
373
- Interop::request_to_native_lib(ctx, "net.batch_query", params) do |resp|
374
- if resp.success?
375
- yield NativeLibResponsetResult.new(
376
- result: ResultOfBatchQuery.new(resp.result["results"])
377
- )
378
- else
379
- yield resp
390
+ def self.batch_query(ctx, params)
391
+ Interop::request_to_native_lib(ctx, "net.batch_query", params) do |resp|
392
+ if resp.success?
393
+ yield NativeLibResponsetResult.new(
394
+ result: ResultOfBatchQuery.new(resp.result["results"])
395
+ )
396
+ else
397
+ yield resp
398
+ end
380
399
  end
381
400
  end
382
- end
383
401
 
384
- def self.aggregate_collection(ctx, params)
385
- Interop::request_to_native_lib(ctx, "net.aggregate_collection", params) do |resp|
386
- if resp.success?
387
- yield NativeLibResponsetResult.new(
388
- result: ResultOfAggregateCollection.new(resp.result["values"])
389
- )
390
- else
391
- yield resp
402
+ def self.aggregate_collection(ctx, params)
403
+ Interop::request_to_native_lib(ctx, "net.aggregate_collection", params) do |resp|
404
+ if resp.success?
405
+ yield NativeLibResponsetResult.new(
406
+ result: ResultOfAggregateCollection.new(resp.result["values"])
407
+ )
408
+ else
409
+ yield resp
410
+ end
392
411
  end
393
412
  end
394
- end
395
413
 
396
- def self.get_endpoints(ctx, params)
397
- Interop::request_to_native_lib(ctx, "net.get_endpoints", params) do |resp|
398
- if resp.success?
399
- yield NativeLibResponsetResult.new(
400
- result: ResultOfGetEndpoints.new(
401
- query: resp.result["query"],
402
- endpoints: resp.result["endpoints"],
414
+ def self.get_endpoints(ctx, params)
415
+ Interop::request_to_native_lib(ctx, "net.get_endpoints", params) do |resp|
416
+ if resp.success?
417
+ yield NativeLibResponsetResult.new(
418
+ result: ResultOfGetEndpoints.new(
419
+ query: resp.result["query"],
420
+ endpoints: resp.result["endpoints"],
421
+ )
403
422
  )
404
- )
405
- else
406
- yield resp
423
+ else
424
+ yield resp
425
+ end
407
426
  end
408
427
  end
409
- end
410
428
 
411
- def self.query_counterparties(ctx, params)
412
- Interop::request_to_native_lib(ctx, "net.query_counterparties", params) do |resp|
413
- if resp.success?
414
- yield NativeLibResponsetResult.new(
415
- result: ResultOfQueryCollection.new(resp.result["result"])
416
- )
417
- else
418
- yield resp
429
+ def self.query_counterparties(ctx, params)
430
+ Interop::request_to_native_lib(ctx, "net.query_counterparties", params) do |resp|
431
+ if resp.success?
432
+ yield NativeLibResponsetResult.new(
433
+ result: ResultOfQueryCollection.new(resp.result["result"])
434
+ )
435
+ else
436
+ yield resp
437
+ end
419
438
  end
420
439
  end
421
- end
422
440
 
423
- def self.query_transaction_tree(ctx, params)
424
- Interop::request_to_native_lib(ctx, "net.query_transaction_tree", params) do |resp|
425
- if resp.success?
426
- yield NativeLibResponsetResult.new(
427
- result: ResultOfQueryTransactionTree.new(
428
- messages: resp.result["messages"],
429
- transactions: resp.result["transactions"],
441
+ def self.query_transaction_tree(ctx, params)
442
+ Interop::request_to_native_lib(ctx, "net.query_transaction_tree", params) do |resp|
443
+ if resp.success?
444
+ yield NativeLibResponsetResult.new(
445
+ result: ResultOfQueryTransactionTree.new(
446
+ messages: resp.result["messages"],
447
+ transactions: resp.result["transactions"],
448
+ )
430
449
  )
431
- )
432
- else
433
- yield resp
450
+ else
451
+ yield resp
452
+ end
434
453
  end
435
454
  end
455
+
456
+ def self.create_block_iterator(ctx, params)
457
+ Interop::request_to_native_lib(ctx, "net.create_block_iterator", params) do |resp|
458
+ if resp.success?
459
+ yield NativeLibResponsetResult.new(
460
+ result: RegisteredIterator.new(resp.result["handle"])
461
+ )
462
+ else
463
+ yield resp
464
+ end
465
+ end
466
+ end
467
+
468
+ def self.resume_block_iterator(ctx, params)
469
+ Interop::request_to_native_lib(ctx, "net.resume_block_iterator", params) do |resp|
470
+ if resp.success?
471
+ yield NativeLibResponsetResult.new(
472
+ result: RegisteredIterator.new(resp.result["handle"])
473
+ )
474
+ else
475
+ yield resp
476
+ end
477
+ end
478
+ end
479
+
480
+ def self.create_transaction_iterator(ctx, params)
481
+ Interop::request_to_native_lib(ctx, "net.create_transaction_iterator", params) do |resp|
482
+ if resp.success?
483
+ yield NativeLibResponsetResult.new(
484
+ result: RegisteredIterator.new(resp.result["handle"])
485
+ )
486
+ else
487
+ yield resp
488
+ end
489
+ end
490
+ end
491
+
492
+ def self.resume_transaction_iterator(ctx, params)
493
+ Interop::request_to_native_lib(ctx, "net.resume_transaction_iterator", params) do |resp|
494
+ if resp.success?
495
+ yield NativeLibResponsetResult.new(
496
+ result: RegisteredIterator.new(resp.result["handle"])
497
+ )
498
+ else
499
+ yield resp
500
+ end
501
+ end
502
+ end
503
+
504
+ def self.iterator_next(ctx, params)
505
+ Interop::request_to_native_lib(ctx, "net.iterator_next", params) do |resp|
506
+ if resp.success?
507
+ yield NativeLibResponsetResult.new(
508
+ result: ResultOfIteratorNext.new(
509
+ items: resp.result["items"],
510
+ has_more: resp.result["has_more"],
511
+ resume_state: resp.result["resume_state"]
512
+ )
513
+ )
514
+ else
515
+ yield resp
516
+ end
517
+ end
518
+ end
519
+
520
+ def self.remove_iterator(ctx, params)
521
+ Interop::request_to_native_lib(ctx, "net.remove_iterator", params) do |resp|
522
+ if resp.success?
523
+ yield NativeLibResponsetResult.new(
524
+ result: nil
525
+ )
526
+ else
527
+ yield resp
528
+ end
529
+ end
530
+ end
531
+
436
532
  end
437
533
  end
@@ -51,6 +51,9 @@ module TonSdk
51
51
  ParamsOfDecompressZstd = Struct.new(:compressed)
52
52
  ResultOfDecompressZstd = Struct.new(:decompressed)
53
53
 
54
+ ParamsOfGetAddressType = Struct.new(:address)
55
+ ResultOfGetAddressType = Struct.new(:address_type)
56
+
54
57
 
55
58
  #
56
59
  # functions
@@ -60,7 +63,7 @@ module TonSdk
60
63
  Interop::request_to_native_lib(ctx, "utils.convert_address", params) do |resp|
61
64
  if resp.success?
62
65
  yield NativeLibResponsetResult.new(
63
- result: Utils::ResultOfConvertAddress.new(resp.result["address"])
66
+ result: ResultOfConvertAddress.new(resp.result["address"])
64
67
  )
65
68
  else
66
69
  yield resp
@@ -72,7 +75,7 @@ module TonSdk
72
75
  Interop::request_to_native_lib(ctx, "utils.calc_storage_fee", params) do |resp|
73
76
  if resp.success?
74
77
  yield NativeLibResponsetResult.new(
75
- result: Utils::ResultOfCalcStorageFee.new(resp.result["fee"])
78
+ result: ResultOfCalcStorageFee.new(resp.result["fee"])
76
79
  )
77
80
  else
78
81
  yield resp
@@ -84,7 +87,7 @@ module TonSdk
84
87
  Interop::request_to_native_lib(ctx, "utils.compress_zstd", params) do |resp|
85
88
  if resp.success?
86
89
  yield NativeLibResponsetResult.new(
87
- result: Utils::ResultOfCompressZstd.new(resp.result["compressed"])
90
+ result: ResultOfCompressZstd.new(resp.result["compressed"])
88
91
  )
89
92
  else
90
93
  yield resp
@@ -96,7 +99,19 @@ module TonSdk
96
99
  Interop::request_to_native_lib(ctx, "utils.decompress_zstd", params) do |resp|
97
100
  if resp.success?
98
101
  yield NativeLibResponsetResult.new(
99
- result: Utils::ParamsOfDecompressZstd.new(resp.result["decompressed"])
102
+ result: ParamsOfDecompressZstd.new(resp.result["decompressed"])
103
+ )
104
+ else
105
+ yield resp
106
+ end
107
+ end
108
+ end
109
+
110
+ def self.get_address_type(ctx, params)
111
+ Interop::request_to_native_lib(ctx, "utils.get_address_type", params) do |resp|
112
+ if resp.success?
113
+ yield NativeLibResponsetResult.new(
114
+ result: ResultOfGetAddressType.new(resp.result["address_type"])
100
115
  )
101
116
  else
102
117
  yield resp
@@ -1,4 +1,4 @@
1
1
  module TonSdk
2
- VERSION = "1.16.1"
3
- NATIVE_SDK_VERSION = "1.16.1"
2
+ VERSION = "1.20.0"
3
+ NATIVE_SDK_VERSION = "1.20.0"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ton_sdk_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.1
4
+ version: 1.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Maslakov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-23 00:00:00.000000000 Z
11
+ date: 2021-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi