near 0.1.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +27 -0
- data/README.md +91 -4
- data/VERSION +1 -1
- data/lib/near/account.rb +11 -0
- data/lib/near/action.rb +141 -0
- data/lib/near/balance.rb +15 -2
- data/lib/near/block.rb +159 -1
- data/lib/near/cli/account.rb +13 -13
- data/lib/near/cli/contract.rb +26 -14
- data/lib/near/cli.rb +4 -1
- data/lib/near/error.rb +18 -0
- data/lib/near/mainnet.rb +17 -0
- data/lib/near/network.rb +134 -0
- data/lib/near/testnet.rb +17 -0
- data/lib/near/transaction.rb +113 -1
- data/lib/near.rb +19 -0
- metadata +77 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 147f21ee313f56cb2e1327e8817df79796dd56fe90eff771e9057e6d7248c4f5
|
4
|
+
data.tar.gz: bf81f3240cb7e18c519d85696bf472b1bf2c8e56c3049aa942fe2aaae37e38f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cfef8be7777c9dd2f2f839284581a44a0f2479f256f09e759628c21509a6d3bc9b95ad07c7e0e13a2e8c22aa5238bd826a224cdac9c6e649388bd060971569d
|
7
|
+
data.tar.gz: 4c5e69608fe79e7a1e0f7a9046477ea9c590d61d1ee6bf12b530054775fc26464d68ddd29c6c9655f05459faf2752a4c7119e5a29afb17a2500ba115618d0b3d
|
data/CHANGES.md
CHANGED
@@ -5,6 +5,33 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
+
## 0.3.0 - 2025-02-02
|
9
|
+
|
10
|
+
### Added
|
11
|
+
- Implement block data accessors
|
12
|
+
- Implement transaction data accessors
|
13
|
+
- Implement action parsing
|
14
|
+
|
15
|
+
### Changed
|
16
|
+
- Adopt Faraday as the HTTP client
|
17
|
+
- Improve HTTP error handling and retries
|
18
|
+
|
19
|
+
## 0.2.0 - 2025-01-29
|
20
|
+
|
21
|
+
### Added
|
22
|
+
- `Network#fetch(block)`
|
23
|
+
- `NEAR.testnet`, `NEAR.mainnet`
|
24
|
+
|
25
|
+
### Changed
|
26
|
+
- Use the NEAR_CLI environmnet variable, if set
|
27
|
+
- Use a temporary file for `call_function`
|
28
|
+
- Enhance `call_function()`
|
29
|
+
- Enhance `create_account_with_funding()`
|
30
|
+
- Enhance `delete_account()`
|
31
|
+
|
32
|
+
### Fixed
|
33
|
+
- Fix the formatting of balances
|
34
|
+
|
8
35
|
## 0.1.0 - 2025-01-19
|
9
36
|
|
10
37
|
## 0.0.0 - 2025-01-11
|
data/README.md
CHANGED
@@ -6,10 +6,12 @@
|
|
6
6
|
[](https://rubydoc.info/gems/near)
|
7
7
|
|
8
8
|
**NEAR.rb** is a [Ruby] client library for the [NEAR Protocol].
|
9
|
-
It
|
9
|
+
It provides a [neardata.xyz] API client as well as wraps the
|
10
|
+
[NEAR command-line interface] (CLI) in a usable Ruby interface.
|
10
11
|
|
11
12
|
## ✨ Features
|
12
13
|
|
14
|
+
- Fetches block data from the [neardata.xyz] API.
|
13
15
|
- Wraps the complete CLI features in an idiomatic Ruby interface.
|
14
16
|
- Provides comprehensive account management operations.
|
15
17
|
- Supports token operations for NEAR and other assets.
|
@@ -23,7 +25,7 @@ It wraps the [NEAR command-line interface] (CLI) into a Ruby interface.
|
|
23
25
|
|
24
26
|
## 🛠️ Prerequisites
|
25
27
|
|
26
|
-
- [NEAR CLI] 0.
|
28
|
+
- [NEAR CLI] 0.19+
|
27
29
|
- [Ruby] 3.0+
|
28
30
|
|
29
31
|
## ⬇️ Installation
|
@@ -36,16 +38,100 @@ gem install near
|
|
36
38
|
|
37
39
|
## 👉 Examples
|
38
40
|
|
41
|
+
- [Importing the library](#importing-the-library)
|
42
|
+
- [Fetching block information](#fetching-block-information)
|
43
|
+
- [Tracking block production](#tracking-block-production)
|
44
|
+
- [Tracking chain transactions](#tracking-chain-transactions)
|
45
|
+
- [Tracking chain actions](#tracking-chain-actions)
|
46
|
+
- [Tracking contract interactions](#tracking-contract-interactions)
|
47
|
+
- [Instantiating the CLI wrapper](#instantiating-the-cli-wrapper)
|
48
|
+
- [Viewing account details](#viewing-account-details)
|
49
|
+
- [Importing accounts](#importing-accounts)
|
50
|
+
- [Creating accounts](#creating-accounts)
|
51
|
+
- [Deleting accounts](#deleting-accounts)
|
52
|
+
- [Managing access keys](#managing-access-keys)
|
53
|
+
- [Managing tokens](#managing-tokens)
|
54
|
+
- [Calling read-only contract methods](#calling-read-only-contract-methods)
|
55
|
+
- [Calling mutative contract methods](#calling-mutative-contract-methods)
|
56
|
+
- [Deploying a smart contract](#deploying-a-smart-contract)
|
57
|
+
|
39
58
|
### Importing the library
|
40
59
|
|
41
60
|
```ruby
|
42
61
|
require 'near'
|
62
|
+
```
|
63
|
+
|
64
|
+
### Fetching block information
|
65
|
+
|
66
|
+
Block data is fetched from the high-performance [neardata.xyz] API
|
67
|
+
that caches blocks using Cloudflare's network with more than 330
|
68
|
+
global edge locations:
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
block = NEAR.testnet.fetch(186_132_854)
|
72
|
+
```
|
73
|
+
|
74
|
+
### Tracking block production
|
75
|
+
|
76
|
+
Thanks to the built-in [neardata.xyz] API client, it is trivial to
|
77
|
+
track the current tip of the chain in a robust and efficient manner:
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
NEAR.testnet.fetch_blocks do |block|
|
81
|
+
puts [block.height, block.hash].join("\t")
|
82
|
+
end
|
83
|
+
```
|
84
|
+
|
85
|
+
### Tracking chain transactions
|
86
|
+
|
87
|
+
See [`examples/monitor_all_transactions.rb`](examples/monitor_all_transactions.rb).
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
NEAR.testnet.fetch_blocks do |block|
|
91
|
+
puts block.inspect
|
43
92
|
|
93
|
+
block.each_transaction do |transaction|
|
94
|
+
puts "\t" + transaction.inspect
|
95
|
+
end
|
96
|
+
end
|
97
|
+
```
|
98
|
+
|
99
|
+
### Tracking chain actions
|
100
|
+
|
101
|
+
See [`examples/monitor_all_actions.rb`](examples/monitor_all_actions.rb).
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
NEAR.testnet.fetch_blocks do |block|
|
105
|
+
puts block.inspect
|
106
|
+
|
107
|
+
block.each_action do |action|
|
108
|
+
puts "\t" + action.inspect
|
109
|
+
end
|
110
|
+
end
|
111
|
+
```
|
112
|
+
|
113
|
+
### Tracking contract interactions
|
114
|
+
|
115
|
+
See [`examples/index_evm_transactions.rb`](examples/index_evm_transactions.rb).
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
NEAR.testnet.fetch_blocks do |block|
|
119
|
+
puts block.inspect
|
120
|
+
|
121
|
+
block.find_actions(:FunctionCall, receiver: 'aurora', method_name: /^submit/) do |action|
|
122
|
+
puts "\t" + action.inspect
|
123
|
+
end
|
124
|
+
end
|
125
|
+
```
|
126
|
+
|
127
|
+
### Instantiating the CLI wrapper
|
128
|
+
|
129
|
+
```ruby
|
44
130
|
# Use the NEAR testnet (the default):
|
45
|
-
testnet = NEAR::CLI.new(network:
|
131
|
+
testnet = NEAR::CLI.new(network: NEAR.testnet)
|
46
132
|
|
47
133
|
# Use the NEAR mainnet (to test in prod):
|
48
|
-
# mainnet = NEAR::CLI.new(network:
|
134
|
+
# mainnet = NEAR::CLI.new(network: NEAR.mainnet)
|
49
135
|
```
|
50
136
|
|
51
137
|
### Viewing account details
|
@@ -230,3 +316,4 @@ git clone https://github.com/dryruby/near.rb.git
|
|
230
316
|
[Ruby]: https://ruby-lang.org
|
231
317
|
[mainnet]: https://docs.near.org/concepts/basics/networks#mainnet
|
232
318
|
[testnet]: https://docs.near.org/concepts/basics/networks#testnet
|
319
|
+
[neardata.xyz]: https://neardata.xyz
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/near/account.rb
CHANGED
@@ -5,12 +5,23 @@
|
|
5
5
|
#
|
6
6
|
# @see https://nomicon.io/DataStructures/Account
|
7
7
|
class NEAR::Account
|
8
|
+
def self.parse(id)
|
9
|
+
self.new(id.to_s)
|
10
|
+
end
|
11
|
+
|
8
12
|
##
|
9
13
|
# @param [String, #to_s] id
|
10
14
|
def initialize(id)
|
11
15
|
@id = id.to_s
|
12
16
|
end
|
13
17
|
|
18
|
+
##
|
19
|
+
# @return [NEAR::Account]
|
20
|
+
def parent
|
21
|
+
return nil unless @id.include?('.')
|
22
|
+
self.class.new(@id.split('.').drop(1).join('.'))
|
23
|
+
end
|
24
|
+
|
14
25
|
##
|
15
26
|
# The account name.
|
16
27
|
#
|
data/lib/near/action.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
# This is free and unencumbered software released into the public domain.
|
2
|
+
|
3
|
+
require 'base64'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
##
|
7
|
+
# Represents a NEAR action.
|
8
|
+
#
|
9
|
+
# @see https://nomicon.io/RuntimeSpec/Actions
|
10
|
+
class NEAR::Action
|
11
|
+
class CreateAccount < NEAR::Action; end
|
12
|
+
|
13
|
+
class DeployContract < NEAR::Action; end
|
14
|
+
|
15
|
+
class FunctionCall < NEAR::Action
|
16
|
+
##
|
17
|
+
# @return [String]
|
18
|
+
attr_reader :method_name
|
19
|
+
def method_name
|
20
|
+
@data['method_name']
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# @return [String]
|
25
|
+
def json_args
|
26
|
+
@json_args ||= JSON.parse(self.args)
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# @param [Symbol, String, #to_s] key
|
31
|
+
# @return [Object]
|
32
|
+
def [](key)
|
33
|
+
self.json_args[key.to_s] rescue nil
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# @return [String]
|
38
|
+
attr_reader :args
|
39
|
+
def args
|
40
|
+
@args ||= Base64.decode64(@data['args'])
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# @return [Integer]
|
45
|
+
attr_reader :gas
|
46
|
+
def gas
|
47
|
+
@data['gas']
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# @return [NEAR::Balance]
|
52
|
+
attr_reader :deposit
|
53
|
+
def deposit
|
54
|
+
@deposit ||= NEAR::Balance.parse(@data['deposit'])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class Transfer < NEAR::Action
|
59
|
+
##
|
60
|
+
# @return [NEAR::Balance]
|
61
|
+
attr_reader :deposit
|
62
|
+
def deposit
|
63
|
+
@deposit ||= NEAR::Balance.parse(@data['deposit'])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class Stake < NEAR::Action; end
|
68
|
+
|
69
|
+
class AddKey < NEAR::Action; end
|
70
|
+
|
71
|
+
class DeleteKey < NEAR::Action; end
|
72
|
+
|
73
|
+
class DeleteAccount < NEAR::Action; end
|
74
|
+
|
75
|
+
class Delegate < NEAR::Action; end
|
76
|
+
|
77
|
+
##
|
78
|
+
# @param [String, Hash] data
|
79
|
+
# @return [NEAR::Action]
|
80
|
+
def self.parse(data)
|
81
|
+
case
|
82
|
+
when data.is_a?(String) then case
|
83
|
+
when 'CreateAccount' then CreateAccount.new
|
84
|
+
when 'DeployContract' then DeployContract.new
|
85
|
+
when 'FunctionCall' then FunctionCall.new
|
86
|
+
when 'Transfer' then Transfer.new
|
87
|
+
when 'Stake' then Stake.new
|
88
|
+
when 'AddKey' then AddKey.new
|
89
|
+
when 'DeleteKey' then DeleteKey.new
|
90
|
+
when 'DeleteAccount' then DeleteAccount.new
|
91
|
+
when 'Delegate' then Delegate.new
|
92
|
+
else self.new
|
93
|
+
end
|
94
|
+
when data['CreateAccount'] then CreateAccount.new(data['CreateAccount'])
|
95
|
+
when data['DeployContract'] then DeployContract.new(data['DeployContract'])
|
96
|
+
when data['FunctionCall'] then FunctionCall.new(data['FunctionCall'])
|
97
|
+
when data['Transfer'] then Transfer.new(data['Transfer'])
|
98
|
+
when data['Stake'] then Stake.new(data['Stake'])
|
99
|
+
when data['AddKey'] then AddKey.new(data['AddKey'])
|
100
|
+
when data['DeleteKey'] then DeleteKey.new(data['DeleteKey'])
|
101
|
+
when data['DeleteAccount'] then DeleteAccount.new(data['DeleteAccount'])
|
102
|
+
when data['Delegate'] then Delegate.new(data['Delegate'])
|
103
|
+
else self.new(data[data.keys.first])
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
##
|
108
|
+
# @param [Hash, #to_h] data
|
109
|
+
def initialize(data = nil)
|
110
|
+
@data = data.to_h if data
|
111
|
+
end
|
112
|
+
|
113
|
+
##
|
114
|
+
# @return [Symbol]
|
115
|
+
attr_reader :type
|
116
|
+
def type
|
117
|
+
self.class.name.split('::').last.to_sym
|
118
|
+
end
|
119
|
+
|
120
|
+
##
|
121
|
+
# The action data.
|
122
|
+
#
|
123
|
+
# @return [Hash]
|
124
|
+
attr_reader :data
|
125
|
+
|
126
|
+
##
|
127
|
+
# @return [Hash]
|
128
|
+
def to_h; @data || {}; end
|
129
|
+
|
130
|
+
##
|
131
|
+
# @return [Symbol]
|
132
|
+
def to_sym; self.type; end
|
133
|
+
|
134
|
+
##
|
135
|
+
# @return [String]
|
136
|
+
def inspect
|
137
|
+
data = self.to_h
|
138
|
+
data['args'] = '...' if data['args']
|
139
|
+
"#<#{self.class.name} #{data.to_json}>"
|
140
|
+
end
|
141
|
+
end # NEAR::Block
|
data/lib/near/balance.rb
CHANGED
@@ -5,6 +5,10 @@ require 'bigdecimal'
|
|
5
5
|
##
|
6
6
|
# Represents a NEAR balance.
|
7
7
|
class NEAR::Balance
|
8
|
+
def self.parse(s)
|
9
|
+
self.new(s.to_f / 10**24)
|
10
|
+
end
|
11
|
+
|
8
12
|
def self.from_near(s)
|
9
13
|
self.new(s)
|
10
14
|
end
|
@@ -23,19 +27,28 @@ class NEAR::Balance
|
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
30
|
+
##
|
31
|
+
# The canonical zero balance.
|
32
|
+
ZERO = self.new(0).freeze
|
33
|
+
|
26
34
|
##
|
27
35
|
# The balance as a Ⓝ-prefixed string.
|
28
36
|
#
|
29
37
|
# @return [String]
|
30
38
|
def inspect
|
31
|
-
"
|
39
|
+
"Ⓝ #{@quantity.to_f}"
|
32
40
|
end
|
33
41
|
|
34
42
|
##
|
35
43
|
# The balance as a string.
|
36
44
|
#
|
37
45
|
# @return [String]
|
38
|
-
def to_s
|
46
|
+
def to_s
|
47
|
+
case @quantity
|
48
|
+
when BigDecimal then @quantity.to_s('F')
|
49
|
+
else @quantity.to_s
|
50
|
+
end
|
51
|
+
end
|
39
52
|
|
40
53
|
##
|
41
54
|
# The balance as a rational number.
|
data/lib/near/block.rb
CHANGED
@@ -26,9 +26,11 @@ class NEAR::Block
|
|
26
26
|
##
|
27
27
|
# @param [Integer, #to_i] height
|
28
28
|
# @param [String, #to_s] hash
|
29
|
-
|
29
|
+
# @param [Hash, #to_h] data
|
30
|
+
def initialize(height: nil, hash: nil, data: nil)
|
30
31
|
@height = height.to_i if height
|
31
32
|
@hash = hash.to_s if hash
|
33
|
+
@data = data.to_h if data
|
32
34
|
end
|
33
35
|
|
34
36
|
##
|
@@ -43,6 +45,133 @@ class NEAR::Block
|
|
43
45
|
# @return [String]
|
44
46
|
attr_reader :hash
|
45
47
|
|
48
|
+
##
|
49
|
+
# The block data, if fetched.
|
50
|
+
#
|
51
|
+
# @return [Hash]
|
52
|
+
attr_reader :data
|
53
|
+
|
54
|
+
##
|
55
|
+
# @return [String]
|
56
|
+
attr_reader :author
|
57
|
+
def author
|
58
|
+
self.data['block']['author']
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# The block header.
|
63
|
+
#
|
64
|
+
# @return [Hash]
|
65
|
+
attr_reader :header
|
66
|
+
def header
|
67
|
+
self.data['block']['header']
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# @return [Array<Hash>]
|
72
|
+
attr_reader :chunks
|
73
|
+
def chunks
|
74
|
+
self.data['block']['chunks']
|
75
|
+
end
|
76
|
+
|
77
|
+
##
|
78
|
+
# @return [Array<Hash>]
|
79
|
+
attr_reader :shards
|
80
|
+
def shards
|
81
|
+
self.data['shards']
|
82
|
+
end
|
83
|
+
|
84
|
+
##
|
85
|
+
# The set of signers in the transactions in this block.
|
86
|
+
#
|
87
|
+
# @return [Array<NEAR::Account>]
|
88
|
+
def signers
|
89
|
+
self.collect_transaction_field('signer_id')
|
90
|
+
.map { |id| NEAR::Account.new(id) }
|
91
|
+
end
|
92
|
+
|
93
|
+
##
|
94
|
+
# The set of receivers in the transactions in this block.
|
95
|
+
#
|
96
|
+
# @return [Array<NEAR::Account>]
|
97
|
+
def receivers
|
98
|
+
self.collect_transaction_field('receiver_id')
|
99
|
+
.map { |id| NEAR::Account.new(id) }
|
100
|
+
end
|
101
|
+
|
102
|
+
##
|
103
|
+
# Enumerates the transactions in this block.
|
104
|
+
#
|
105
|
+
# @yield [NEAR::Transaction]
|
106
|
+
# @yieldparam [NEAR::Transaction] transaction
|
107
|
+
# @yieldreturn [void]
|
108
|
+
# @return [Enumerator] if no block is given
|
109
|
+
def each_transaction(&)
|
110
|
+
return enum_for(:each_transaction) unless block_given?
|
111
|
+
self.each_chunk do |chunk|
|
112
|
+
next if !chunk['transactions']
|
113
|
+
chunk['transactions'].each do |tx|
|
114
|
+
yield NEAR::Transaction.parse(tx)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
##
|
120
|
+
# Enumerates the actions in this block.
|
121
|
+
#
|
122
|
+
# @yield [NEAR::Action, NEAR::Transaction]
|
123
|
+
# @yieldparam [NEAR::Action] action
|
124
|
+
# @yieldparam [NEAR::Transaction] transaction
|
125
|
+
# @yieldreturn [void]
|
126
|
+
# @return [Enumerator] if no block is given
|
127
|
+
def each_action(&)
|
128
|
+
return enum_for(:each_action) unless block_given?
|
129
|
+
self.each_transaction do |tx|
|
130
|
+
tx.each_action do |action|
|
131
|
+
yield action, tx
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
##
|
137
|
+
# @param [Symbol, #to_sym] type
|
138
|
+
# @param [String, Regexp] signer
|
139
|
+
# @param [String, Regexp] receiver
|
140
|
+
# @param [String, Regexp] method_name
|
141
|
+
# @yield [NEAR::Action, NEAR::Transaction]
|
142
|
+
# @yieldparam [NEAR::Action] action
|
143
|
+
# @yieldparam [NEAR::Transaction] transaction
|
144
|
+
# @yieldreturn [void]
|
145
|
+
# @return [Enumerator] if no block is given
|
146
|
+
def find_actions(type, signer: nil, receiver: nil, method_name: nil, &)
|
147
|
+
return enum_for(:each_action) unless block_given?
|
148
|
+
type = type.to_sym
|
149
|
+
self.each_transaction do |tx|
|
150
|
+
next if signer && !(signer === tx.signer_id)
|
151
|
+
next if receiver && !(receiver === tx.receiver_id)
|
152
|
+
tx.each_action do |action|
|
153
|
+
next unless type == action.type
|
154
|
+
next if method_name && !(method_name === action.method_name)
|
155
|
+
yield action, tx
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
##
|
161
|
+
# Enumerates the chunks in this block.
|
162
|
+
#
|
163
|
+
# @yield [Hash]
|
164
|
+
# @yieldparam [Hash] chunk
|
165
|
+
# @yieldreturn [void]
|
166
|
+
# @return [Enumerator] if no block is given
|
167
|
+
def each_chunk(&)
|
168
|
+
return enum_for(:each_chunk) unless block_given?
|
169
|
+
self.shards.each do |shard|
|
170
|
+
chunk = shard['chunk']
|
171
|
+
yield chunk if chunk
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
46
175
|
##
|
47
176
|
# @return [Array<String>]
|
48
177
|
def to_cli_args
|
@@ -51,9 +180,38 @@ class NEAR::Block
|
|
51
180
|
['now']
|
52
181
|
end
|
53
182
|
|
183
|
+
##
|
184
|
+
# @return [Integer]
|
185
|
+
def to_i; @height; end
|
186
|
+
|
54
187
|
##
|
55
188
|
# @return [String]
|
56
189
|
def to_s
|
57
190
|
(@height || @hash || :now).to_s
|
58
191
|
end
|
192
|
+
|
193
|
+
##
|
194
|
+
# @return [Hash]
|
195
|
+
def to_h; @data; end
|
196
|
+
|
197
|
+
##
|
198
|
+
# @return [String]
|
199
|
+
def inspect
|
200
|
+
"#<#{self.class.name} height: #{@height}, hash: #{@hash.inspect}>"
|
201
|
+
end
|
202
|
+
|
203
|
+
protected
|
204
|
+
|
205
|
+
##
|
206
|
+
# @param [String] field
|
207
|
+
# @return [Array<String>]
|
208
|
+
def collect_transaction_field(field)
|
209
|
+
result = {}
|
210
|
+
self.shards.each do |shard|
|
211
|
+
shard['chunk']['transactions'].each do |tx|
|
212
|
+
result[tx['transaction']['receiver_id']] = true
|
213
|
+
end
|
214
|
+
end
|
215
|
+
result.keys
|
216
|
+
end
|
59
217
|
end # NEAR::Block
|
data/lib/near/cli/account.rb
CHANGED
@@ -88,18 +88,17 @@ module NEAR::CLI::Account
|
|
88
88
|
##
|
89
89
|
# Creates a new account funded by another account.
|
90
90
|
#
|
91
|
-
# @param [
|
92
|
-
# @param [
|
93
|
-
# @param [
|
94
|
-
# @param [String] deposit
|
91
|
+
# @param [NEAR::Account] new_account
|
92
|
+
# @param [NEAR::Account] signer Account that signs & funds the transaction
|
93
|
+
# @param [NEAR::Balance] deposit Amount of NEAR to attach
|
95
94
|
# @return [String]
|
96
|
-
def create_account_with_funding(
|
95
|
+
def create_account_with_funding(new_account, signer:, deposit: nil)
|
97
96
|
stdout, stderr = execute(
|
98
97
|
'account',
|
99
98
|
'create-account',
|
100
|
-
'fund-myself',
|
101
|
-
'
|
102
|
-
'sign-as',
|
99
|
+
'fund-myself', new_account.to_s, (deposit ? deposit.to_s : '0') + ' NEAR',
|
100
|
+
'autogenerate-new-keypair', 'save-to-keychain',
|
101
|
+
'sign-as', signer.to_s,
|
103
102
|
'network-config', @network,
|
104
103
|
'sign-with-keychain',
|
105
104
|
'send'
|
@@ -126,14 +125,15 @@ module NEAR::CLI::Account
|
|
126
125
|
##
|
127
126
|
# Deletes an account and transfers remaining balance to beneficiary.
|
128
127
|
#
|
129
|
-
# @param [
|
130
|
-
# @param [
|
128
|
+
# @param [NEAR::Account] account
|
129
|
+
# @param [NEAR::Account] beneficiary
|
131
130
|
# @return [String]
|
132
|
-
def delete_account(
|
131
|
+
def delete_account(account, beneficiary: nil)
|
132
|
+
account = NEAR::Account.parse(account)
|
133
133
|
stdout, stderr = execute(
|
134
134
|
'account',
|
135
|
-
'delete-account',
|
136
|
-
'beneficiary',
|
135
|
+
'delete-account', account.to_s,
|
136
|
+
'beneficiary', (beneficiary || account.parent).to_s,
|
137
137
|
'network-config', @network,
|
138
138
|
'sign-with-keychain',
|
139
139
|
'send'
|
data/lib/near/cli/contract.rb
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
# This is free and unencumbered software released into the public domain.
|
2
2
|
|
3
|
+
require "base64"
|
4
|
+
require "pathname"
|
5
|
+
|
3
6
|
##
|
4
7
|
# @see https://github.com/near/near-cli-rs/blob/main/docs/GUIDE.en.md#contract---Manage-smart-contracts-deploy-code-call-functions
|
5
8
|
module NEAR::CLI::Contract
|
6
9
|
##
|
7
10
|
# Calls a view method on a contract (read-only).
|
8
11
|
#
|
9
|
-
# @param [
|
12
|
+
# @param [NEAR::Account] contract
|
10
13
|
# @param [String] method_name
|
11
14
|
# @param [Hash] args JSON arguments for the method
|
12
15
|
# @param [Block, Integer, String, Symbol] block
|
13
16
|
# @return [String] The method call result
|
14
|
-
def view_call(
|
17
|
+
def view_call(contract, method_name, args = {}, block: :now)
|
15
18
|
stdout, _ = execute(
|
16
19
|
'contract',
|
17
20
|
'call-function',
|
18
|
-
'as-read-only',
|
21
|
+
'as-read-only', contract.to_s, method_name,
|
19
22
|
'json-args', args.to_json,
|
20
23
|
'network-config', @network,
|
21
24
|
*block_args(block)
|
@@ -26,22 +29,31 @@ module NEAR::CLI::Contract
|
|
26
29
|
##
|
27
30
|
# Calls a state-changing method on a contract.
|
28
31
|
#
|
29
|
-
# @param [
|
32
|
+
# @param [NEAR::Account] contract
|
30
33
|
# @param [String] method_name
|
31
|
-
# @param [Hash] args
|
32
|
-
# @param [
|
33
|
-
# @param [
|
34
|
-
# @param [
|
34
|
+
# @param [Hash, Array, String, Pathname] args Arguments for the method
|
35
|
+
# @param [NEAR::Account] signer Account that signs the transaction
|
36
|
+
# @param [NEAR::Balance] deposit Amount of NEAR to attach
|
37
|
+
# @param [NEAR::Gas, #to_s] gas Amount of gas to attach
|
35
38
|
# @return [String] Transaction result
|
36
|
-
def call_function(
|
39
|
+
def call_function(contract, method_name, args = {}, signer:, deposit: nil, gas: '100.0 Tgas')
|
40
|
+
args = case args
|
41
|
+
when Hash, Array then ['json-args', args.to_json]
|
42
|
+
when String then case
|
43
|
+
when args.ascii_only? then ['text-args', args]
|
44
|
+
else ['base64-args', Base64.strict_encode64(args)]
|
45
|
+
end
|
46
|
+
when Pathname then ['file-args', args.to_s]
|
47
|
+
else raise ArgumentError, "Invalid argument type: #{args.inspect}"
|
48
|
+
end
|
37
49
|
stdout, stderr = execute(
|
38
50
|
'contract',
|
39
51
|
'call-function',
|
40
|
-
'as-transaction',
|
41
|
-
|
42
|
-
'prepaid-gas', gas,
|
43
|
-
'attached-deposit', deposit,
|
44
|
-
'sign-as',
|
52
|
+
'as-transaction', contract.to_s, method_name.to_s,
|
53
|
+
*args,
|
54
|
+
'prepaid-gas', gas.to_s,
|
55
|
+
'attached-deposit', (deposit ? deposit.to_s : '0') + ' NEAR',
|
56
|
+
'sign-as', signer.to_s,
|
45
57
|
'network-config', @network,
|
46
58
|
'sign-with-keychain',
|
47
59
|
'send'
|
data/lib/near/cli.rb
CHANGED
@@ -22,6 +22,8 @@ class NEAR::CLI
|
|
22
22
|
class ExecutionError < Error; end
|
23
23
|
|
24
24
|
def self.find_program
|
25
|
+
return ENV['NEAR_CLI'] if ENV['NEAR_CLI']
|
26
|
+
|
25
27
|
# First, check `$HOME/.cargo/bin/near`:
|
26
28
|
path = File.expand_path('~/.cargo/bin/near')
|
27
29
|
return path if File.executable?(path)
|
@@ -37,7 +39,7 @@ class NEAR::CLI
|
|
37
39
|
|
38
40
|
##
|
39
41
|
# @param [String, #to_s] path
|
40
|
-
# @param [
|
42
|
+
# @param [Network, #to_s] network
|
41
43
|
def initialize(path: self.class.find_program, network: NEAR_ENV)
|
42
44
|
@path, @network = path.to_s, network.to_s
|
43
45
|
end
|
@@ -61,6 +63,7 @@ class NEAR::CLI
|
|
61
63
|
# @param [Array<String>] args
|
62
64
|
# @return [Array<String>]
|
63
65
|
def execute(*args)
|
66
|
+
#command = [@path, '--quiet', *args.map(&:to_s)] # TODO: near-cli-rs 0.19+
|
64
67
|
command = [@path, *args.map(&:to_s)]
|
65
68
|
puts command.join(' ') if false
|
66
69
|
stdout, stderr, status = Open3.capture3(*command)
|
data/lib/near/error.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# This is free and unencumbered software released into the public domain.
|
2
|
+
|
3
|
+
class NEAR::Error < StandardError
|
4
|
+
class InvalidBlock < NEAR::Error
|
5
|
+
def initialize(block_height = nil)
|
6
|
+
@block_height = block_height.to_i if block_height
|
7
|
+
super(block_height ?
|
8
|
+
"Block height ##{block_height.to_i} does not exist" :
|
9
|
+
"Block height does not exist")
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :block_height
|
13
|
+
end # NEAR::Error::InvalidBlock
|
14
|
+
|
15
|
+
class TemporaryProblem < NEAR::Error; end
|
16
|
+
|
17
|
+
class UnexpectedProblem < NEAR::Error; end
|
18
|
+
end # NEAR::Error
|
data/lib/near/mainnet.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# This is free and unencumbered software released into the public domain.
|
2
|
+
|
3
|
+
require_relative 'network'
|
4
|
+
|
5
|
+
##
|
6
|
+
# Represents the NEAR Mainnet.
|
7
|
+
#
|
8
|
+
# @see https://docs.near.org/concepts/basics/networks#mainnet
|
9
|
+
class NEAR::Mainnet < NEAR::Network
|
10
|
+
NEARDATA_URL = 'https://mainnet.neardata.xyz'.freeze
|
11
|
+
|
12
|
+
##
|
13
|
+
# @return [void]
|
14
|
+
def initialize
|
15
|
+
super(:mainnet)
|
16
|
+
end
|
17
|
+
end # NEAR::Mainnet
|
data/lib/near/network.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
# This is free and unencumbered software released into the public domain.
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
require 'faraday/follow_redirects'
|
5
|
+
require 'faraday/retry'
|
6
|
+
|
7
|
+
require_relative 'error'
|
8
|
+
|
9
|
+
##
|
10
|
+
# Represents a NEAR Protocol network.
|
11
|
+
#
|
12
|
+
# @see https://docs.near.org/concepts/basics/networks
|
13
|
+
class NEAR::Network
|
14
|
+
##
|
15
|
+
# @param [Symbol, #to_sym] id
|
16
|
+
# @return [void]
|
17
|
+
def initialize(id)
|
18
|
+
@id = id.to_sym
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# @return [String]
|
23
|
+
def to_s; @id.to_s; end
|
24
|
+
|
25
|
+
##
|
26
|
+
# @return [String]
|
27
|
+
def neardata_url
|
28
|
+
self.class.const_get(:NEARDATA_URL)
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Fetches a block range.
|
33
|
+
#
|
34
|
+
# The block data is fetched from the neardata.xyz API.
|
35
|
+
#
|
36
|
+
# @param [NEAR::Block, #to_i] from
|
37
|
+
# @param [NEAR::Block, #to_i] to
|
38
|
+
# @yield [NEAR::Block]
|
39
|
+
# @yieldparam [NEAR::Block] block
|
40
|
+
# @yieldreturn [void]
|
41
|
+
# @return [Enumerator]
|
42
|
+
def fetch_blocks(from: nil, to: nil, &)
|
43
|
+
return enum_for(:fetch_blocks) unless block_given?
|
44
|
+
from = self.fetch_latest.height unless from
|
45
|
+
from, to = from.to_i, to&.to_i
|
46
|
+
(from..to).each do |block_height|
|
47
|
+
yield self.fetch(block_height)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# Fetches the block at the given height.
|
53
|
+
#
|
54
|
+
# The block data is fetched from the neardata.xyz API.
|
55
|
+
#
|
56
|
+
# @param [NEAR::Block, #to_i] block
|
57
|
+
# @return [NEAR::Block]
|
58
|
+
# @raise [NEAR::Error::InvalidBlock] if the block does not exist
|
59
|
+
def fetch(block)
|
60
|
+
self.fetch_neardata_block(block.to_i)
|
61
|
+
end
|
62
|
+
|
63
|
+
##
|
64
|
+
# Fetches the latest finalized block.
|
65
|
+
#
|
66
|
+
# The block data is fetched from the neardata.xyz API.
|
67
|
+
# The block is guaranteed to exist.
|
68
|
+
#
|
69
|
+
# @return [NEAR::Block]
|
70
|
+
def fetch_latest
|
71
|
+
self.fetch_neardata_block(:final)
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
|
76
|
+
##
|
77
|
+
# @param [Integer, Symbol] block_id
|
78
|
+
# @return [NEAR::Block]
|
79
|
+
def fetch_neardata_block(block_id)
|
80
|
+
request_path = case block_id
|
81
|
+
when Integer then "/v0/block/#{block_id}"
|
82
|
+
when Symbol then "/v0/last_block/#{block_id}"
|
83
|
+
else raise ArgumentError
|
84
|
+
end
|
85
|
+
|
86
|
+
begin
|
87
|
+
block_data = self.fetch_neardata_url(request_path)
|
88
|
+
rescue Faraday::ResourceNotFound => error
|
89
|
+
case error.response[:body]['type']
|
90
|
+
when "BLOCK_DOES_NOT_EXIST", "BLOCK_HEIGHT_TOO_LOW", "BLOCK_HEIGHT_TOO_HIGH"
|
91
|
+
raise NEAR::Error::InvalidBlock, block_id
|
92
|
+
else raise NEAR::Error::UnexpectedProblem
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
return nil if block_data.nil? || block_data == 'null'
|
97
|
+
block_header = block_data['block']['header']
|
98
|
+
block_height = block_header['height'].to_i
|
99
|
+
block_hash = block_header['hash'].to_s
|
100
|
+
NEAR::Block.new(height: block_height, hash: block_hash, data: block_data)
|
101
|
+
end
|
102
|
+
|
103
|
+
##
|
104
|
+
# @return [Object]
|
105
|
+
def fetch_neardata_url(path)
|
106
|
+
begin
|
107
|
+
retries ||= 0
|
108
|
+
self.http_client.get("#{neardata_url}#{path}").body
|
109
|
+
rescue Faraday::ConnectionFailed => error
|
110
|
+
# `Faraday::Retry` doesn't seem able to handle `ConnectionFailed`,
|
111
|
+
# so we'll handle it manually here. Note that in case of a DNS error,
|
112
|
+
# there's no point in retrying, so we'll wrap & re-raise the error.
|
113
|
+
case error.wrapped_exception
|
114
|
+
when Socket::ResolutionError then raise NEAR::Error::TemporaryProblem
|
115
|
+
else retry if (retries += 1) < 3
|
116
|
+
end
|
117
|
+
raise NEAR::Error::UnexpectedProblem
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
##
|
122
|
+
# @return [Faraday::Connection]
|
123
|
+
def http_client
|
124
|
+
Faraday.new do |faraday|
|
125
|
+
faraday.response :raise_error
|
126
|
+
faraday.response :follow_redirects
|
127
|
+
faraday.response :json
|
128
|
+
faraday.request :retry, {
|
129
|
+
max: 3,
|
130
|
+
exceptions: Faraday::Retry::Middleware::DEFAULT_EXCEPTIONS + [Faraday::ConnectionFailed]
|
131
|
+
}.freeze
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end # NEAR::Testnet
|
data/lib/near/testnet.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# This is free and unencumbered software released into the public domain.
|
2
|
+
|
3
|
+
require_relative 'network'
|
4
|
+
|
5
|
+
##
|
6
|
+
# Represents the NEAR Testnet.
|
7
|
+
#
|
8
|
+
# @see https://docs.near.org/concepts/basics/networks#testnet
|
9
|
+
class NEAR::Testnet < NEAR::Network
|
10
|
+
NEARDATA_URL = 'https://testnet.neardata.xyz'.freeze
|
11
|
+
|
12
|
+
##
|
13
|
+
# @return [void]
|
14
|
+
def initialize
|
15
|
+
super(:testnet)
|
16
|
+
end
|
17
|
+
end # NEAR::Testnet
|
data/lib/near/transaction.rb
CHANGED
@@ -3,10 +3,21 @@
|
|
3
3
|
##
|
4
4
|
# Represents a NEAR transaction.
|
5
5
|
class NEAR::Transaction
|
6
|
+
##
|
7
|
+
# @param [Hash] json
|
8
|
+
# @return [NEAR::Transaction]
|
9
|
+
def self.parse(json)
|
10
|
+
tx_data = json['transaction']
|
11
|
+
NEAR::Transaction.new(tx_data['hash'], data: tx_data)
|
12
|
+
end
|
13
|
+
|
6
14
|
##
|
7
15
|
# @param [String, #to_s] hash
|
8
|
-
|
16
|
+
# @param [Hash, #to_h] data
|
17
|
+
# @return [void]
|
18
|
+
def initialize(hash, data: nil)
|
9
19
|
@hash = hash.to_s
|
20
|
+
@data = data.to_h if data
|
10
21
|
end
|
11
22
|
|
12
23
|
##
|
@@ -15,7 +26,108 @@ class NEAR::Transaction
|
|
15
26
|
# @return [String]
|
16
27
|
attr_reader :hash
|
17
28
|
|
29
|
+
##
|
30
|
+
# The transaction data, if available.
|
31
|
+
#
|
32
|
+
# @return [Hash]
|
33
|
+
attr_reader :data
|
34
|
+
|
35
|
+
##
|
36
|
+
# The transaction signer account.
|
37
|
+
#
|
38
|
+
# @return [NEAR::Account]
|
39
|
+
attr_reader :signer
|
40
|
+
def signer
|
41
|
+
@signer ||= NEAR::Account.new(self.signer_id)
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# The transaction signer ID.
|
46
|
+
#
|
47
|
+
# @return [String]
|
48
|
+
attr_reader :signer_id
|
49
|
+
def signer_id
|
50
|
+
self.data['signer_id']
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# The transaction receiver account.
|
55
|
+
#
|
56
|
+
# @return [NEAR::Account]
|
57
|
+
attr_reader :receiver
|
58
|
+
def receiver
|
59
|
+
@receiver ||= NEAR::Account.new(self.receiver_id)
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# The transaction receiver ID.
|
64
|
+
#
|
65
|
+
# @return [String]
|
66
|
+
attr_reader :receiver_id
|
67
|
+
def receiver_id
|
68
|
+
self.data['receiver_id']
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# @return [String]
|
73
|
+
attr_reader :public_key
|
74
|
+
def public_key
|
75
|
+
self.data['public_key']
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
# @return [String]
|
80
|
+
attr_reader :signature
|
81
|
+
def signature
|
82
|
+
self.data['signature']
|
83
|
+
end
|
84
|
+
|
85
|
+
##
|
86
|
+
# @return [Integer]
|
87
|
+
attr_reader :nonce
|
88
|
+
def nonce
|
89
|
+
self.data['nonce']
|
90
|
+
end
|
91
|
+
|
92
|
+
##
|
93
|
+
# @return [Integer]
|
94
|
+
attr_reader :priority_fee
|
95
|
+
def priority_fee
|
96
|
+
self.data['priority_fee']
|
97
|
+
end
|
98
|
+
|
99
|
+
##
|
100
|
+
# The transaction actions.
|
101
|
+
#
|
102
|
+
# @return [Array<Hash>]
|
103
|
+
attr_reader :actions
|
104
|
+
def actions
|
105
|
+
self.data['actions']
|
106
|
+
end
|
107
|
+
|
108
|
+
##
|
109
|
+
# @yield [NEAR::Action]
|
110
|
+
# @yieldparam [NEAR::Action] action
|
111
|
+
# @yieldreturn [void]
|
112
|
+
# @return [Enumerator] if no block is given
|
113
|
+
def each_action(&)
|
114
|
+
return enum_for(:each_action) unless block_given?
|
115
|
+
self.data['actions'].each do |action|
|
116
|
+
yield NEAR::Action.parse(action)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
18
120
|
##
|
19
121
|
# @return [String]
|
20
122
|
def to_s; @hash; end
|
123
|
+
|
124
|
+
##
|
125
|
+
# @return [Hash]
|
126
|
+
def to_h; @data; end
|
127
|
+
|
128
|
+
##
|
129
|
+
# @return [String]
|
130
|
+
def inspect
|
131
|
+
"#<#{self.class.name} hash: #{@hash.inspect}, signer: #{self.signer}, receiver: #{self.receiver}, actions: #{self.actions.size}>"
|
132
|
+
end
|
21
133
|
end # NEAR::Transaction
|
data/lib/near.rb
CHANGED
@@ -3,8 +3,27 @@
|
|
3
3
|
module NEAR; end
|
4
4
|
|
5
5
|
require_relative 'near/account'
|
6
|
+
require_relative 'near/action'
|
6
7
|
require_relative 'near/balance'
|
7
8
|
require_relative 'near/block'
|
8
9
|
require_relative 'near/cli'
|
10
|
+
require_relative 'near/error'
|
11
|
+
require_relative 'near/mainnet'
|
12
|
+
require_relative 'near/network'
|
13
|
+
require_relative 'near/testnet'
|
9
14
|
require_relative 'near/transaction'
|
10
15
|
require_relative 'near/version'
|
16
|
+
|
17
|
+
module NEAR
|
18
|
+
##
|
19
|
+
# @return [NEAR::Testnet]
|
20
|
+
def self.testnet
|
21
|
+
@testnet ||= Testnet.new
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# @return [NEAR::Mainnet]
|
26
|
+
def self.mainnet
|
27
|
+
@mainnet ||= Mainnet.new
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,84 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: near
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arto Bendiken
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-
|
10
|
+
date: 2025-02-02 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: base64
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '0'
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: bigdecimal
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: faraday
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.12'
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '2.12'
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: faraday-follow_redirects
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0.3'
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0.3'
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: faraday-retry
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '2.0'
|
75
|
+
type: :runtime
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '2.0'
|
12
82
|
- !ruby/object:Gem::Dependency
|
13
83
|
name: rspec
|
14
84
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,6 +120,7 @@ files:
|
|
50
120
|
- VERSION
|
51
121
|
- lib/near.rb
|
52
122
|
- lib/near/account.rb
|
123
|
+
- lib/near/action.rb
|
53
124
|
- lib/near/balance.rb
|
54
125
|
- lib/near/block.rb
|
55
126
|
- lib/near/cli.rb
|
@@ -59,6 +130,10 @@ files:
|
|
59
130
|
- lib/near/cli/staking.rb
|
60
131
|
- lib/near/cli/tokens.rb
|
61
132
|
- lib/near/cli/transaction.rb
|
133
|
+
- lib/near/error.rb
|
134
|
+
- lib/near/mainnet.rb
|
135
|
+
- lib/near/network.rb
|
136
|
+
- lib/near/testnet.rb
|
62
137
|
- lib/near/transaction.rb
|
63
138
|
- lib/near/version.rb
|
64
139
|
homepage: https://github.com/dryruby/near.rb
|