near 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES.md +16 -0
- data/README.md +19 -3
- data/VERSION +1 -1
- data/lib/near/account.rb +11 -0
- data/lib/near/balance.rb +10 -1
- data/lib/near/block.rb +6 -0
- 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/mainnet.rb +17 -0
- data/lib/near/network.rb +43 -0
- data/lib/near/testnet.rb +17 -0
- data/lib/near.rb +17 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf5d4ecbf47a20dcb7316560abfdf3317505824ed2a501dc769e53186db46571
|
4
|
+
data.tar.gz: 5745b4bd4742054e9c5e710b4e267795636fd4d82c0866a3209ed804c306b25a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b877435cf142fab1a9d2f4b6651f1993dbf05b7c8eeea28cc76ea9ac6930a855a6570576ae5fb8012e869949efd1b56ca6cce5474bd318735996c9b8713d74f9
|
7
|
+
data.tar.gz: a0e57d4a298b6e52d320a9c2be9ccc8aef0f6abe7ed24e18535c6dbc0fffdbe153f3b8fa3c676cc33ac5823824d1a878175778684c88d1e272354d841ba9a388
|
data/CHANGES.md
CHANGED
@@ -5,6 +5,22 @@ 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.2.0 - 2025-01-29
|
9
|
+
|
10
|
+
### Added
|
11
|
+
- `Network#fetch(block)`.
|
12
|
+
- `NEAR.testnet`, `NEAR.mainnet`.
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
- Use the NEAR_CLI environmnet variable, if set.
|
16
|
+
- Use a temporary file for `call_function`.
|
17
|
+
- Enhance `call_function()`.
|
18
|
+
- Enhance `create_account_with_funding()`.
|
19
|
+
- Enhance `delete_account()`.
|
20
|
+
|
21
|
+
### Fixed
|
22
|
+
- Fix the formatting of balances.
|
23
|
+
|
8
24
|
## 0.1.0 - 2025-01-19
|
9
25
|
|
10
26
|
## 0.0.0 - 2025-01-11
|
data/README.md
CHANGED
@@ -17,13 +17,14 @@ It wraps the [NEAR command-line interface] (CLI) into a Ruby interface.
|
|
17
17
|
- Handles transaction construction, signing, and monitoring.
|
18
18
|
- Integrates with hardware wallets and secure key storage.
|
19
19
|
- Implements type-safe balance operations and input validation.
|
20
|
+
- Fetches block data from the [neardata.xyz] API.
|
20
21
|
- Supports both the [mainnet] and [testnet] environments.
|
21
22
|
- Offers cross-platform support with zero library dependencies.
|
22
23
|
- 100% free and unencumbered public domain software.
|
23
24
|
|
24
25
|
## 🛠️ Prerequisites
|
25
26
|
|
26
|
-
- [NEAR CLI] 0.
|
27
|
+
- [NEAR CLI] 0.19+
|
27
28
|
- [Ruby] 3.0+
|
28
29
|
|
29
30
|
## ⬇️ Installation
|
@@ -40,12 +41,26 @@ gem install near
|
|
40
41
|
|
41
42
|
```ruby
|
42
43
|
require 'near'
|
44
|
+
```
|
45
|
+
|
46
|
+
### Fetching block information
|
47
|
+
|
48
|
+
Block data is fetched from the high-performance [neardata.xyz] API
|
49
|
+
that caches blocks using Cloudflare's network with more than 330
|
50
|
+
global edge locations:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
block = NEAR.testnet.fetch(186_132_854)
|
54
|
+
```
|
43
55
|
|
56
|
+
### Instantiating the CLI wrapper
|
57
|
+
|
58
|
+
```ruby
|
44
59
|
# Use the NEAR testnet (the default):
|
45
|
-
testnet = NEAR::CLI.new(network:
|
60
|
+
testnet = NEAR::CLI.new(network: NEAR.testnet)
|
46
61
|
|
47
62
|
# Use the NEAR mainnet (to test in prod):
|
48
|
-
# mainnet = NEAR::CLI.new(network:
|
63
|
+
# mainnet = NEAR::CLI.new(network: NEAR.mainnet)
|
49
64
|
```
|
50
65
|
|
51
66
|
### Viewing account details
|
@@ -230,3 +245,4 @@ git clone https://github.com/dryruby/near.rb.git
|
|
230
245
|
[Ruby]: https://ruby-lang.org
|
231
246
|
[mainnet]: https://docs.near.org/concepts/basics/networks#mainnet
|
232
247
|
[testnet]: https://docs.near.org/concepts/basics/networks#testnet
|
248
|
+
[neardata.xyz]: https://neardata.xyz
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.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/balance.rb
CHANGED
@@ -23,6 +23,10 @@ class NEAR::Balance
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
##
|
27
|
+
# The canonical zero balance.
|
28
|
+
ZERO = self.new(0).freeze
|
29
|
+
|
26
30
|
##
|
27
31
|
# The balance as a Ⓝ-prefixed string.
|
28
32
|
#
|
@@ -35,7 +39,12 @@ class NEAR::Balance
|
|
35
39
|
# The balance as a string.
|
36
40
|
#
|
37
41
|
# @return [String]
|
38
|
-
def to_s
|
42
|
+
def to_s
|
43
|
+
case @quantity
|
44
|
+
when BigDecimal then @quantity.to_s('F')
|
45
|
+
else @quantity.to_s
|
46
|
+
end
|
47
|
+
end
|
39
48
|
|
40
49
|
##
|
41
50
|
# The balance as a rational number.
|
data/lib/near/block.rb
CHANGED
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/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,43 @@
|
|
1
|
+
# This is free and unencumbered software released into the public domain.
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
|
5
|
+
##
|
6
|
+
# Represents a NEAR Protocol network.
|
7
|
+
#
|
8
|
+
# @see https://docs.near.org/concepts/basics/networks
|
9
|
+
class NEAR::Network
|
10
|
+
##
|
11
|
+
# @param [Symbol, #to_sym] id
|
12
|
+
# @return [void]
|
13
|
+
def initialize(id)
|
14
|
+
@id = id.to_sym
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# @return [String]
|
19
|
+
def to_s; @id.to_s; end
|
20
|
+
|
21
|
+
##
|
22
|
+
# @return [String]
|
23
|
+
def neardata_url
|
24
|
+
self.class.const_get(:NEARDATA_URL)
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# Fetches the block at the given height.
|
29
|
+
#
|
30
|
+
# The block data is fetched from the neardata.xyz API.
|
31
|
+
# If the block does not exist, `nil` is returned.
|
32
|
+
#
|
33
|
+
# @param [NEAR::Block, #to_i] block
|
34
|
+
# @return [Object]
|
35
|
+
def fetch(block)
|
36
|
+
response = Net::HTTP.get_response(URI("#{neardata_url}/v0/block/#{block.to_i}"))
|
37
|
+
case response
|
38
|
+
when Net::HTTPSuccess then JSON.parse(response.body)
|
39
|
+
when Net::HTTPNotFound then nil
|
40
|
+
else raise response.to_s
|
41
|
+
end
|
42
|
+
end
|
43
|
+
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.rb
CHANGED
@@ -6,5 +6,22 @@ require_relative 'near/account'
|
|
6
6
|
require_relative 'near/balance'
|
7
7
|
require_relative 'near/block'
|
8
8
|
require_relative 'near/cli'
|
9
|
+
require_relative 'near/mainnet'
|
10
|
+
require_relative 'near/network'
|
11
|
+
require_relative 'near/testnet'
|
9
12
|
require_relative 'near/transaction'
|
10
13
|
require_relative 'near/version'
|
14
|
+
|
15
|
+
module NEAR
|
16
|
+
##
|
17
|
+
# @return [NEAR::Testnet]
|
18
|
+
def self.testnet
|
19
|
+
@testnet ||= Testnet.new
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# @return [NEAR::Mainnet]
|
24
|
+
def self.mainnet
|
25
|
+
@mainnet ||= Mainnet.new
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: near
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arto Bendiken
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-01-
|
10
|
+
date: 2025-01-29 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: rspec
|
@@ -59,6 +59,9 @@ files:
|
|
59
59
|
- lib/near/cli/staking.rb
|
60
60
|
- lib/near/cli/tokens.rb
|
61
61
|
- lib/near/cli/transaction.rb
|
62
|
+
- lib/near/mainnet.rb
|
63
|
+
- lib/near/network.rb
|
64
|
+
- lib/near/testnet.rb
|
62
65
|
- lib/near/transaction.rb
|
63
66
|
- lib/near/version.rb
|
64
67
|
homepage: https://github.com/dryruby/near.rb
|