near 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4ab3d2b8796c8b9d6db6d842a843882a02b1497070454e67dda41a2105dbe7aa
4
+ data.tar.gz: 66de38abb9b8bd7162116f110ae2a3f81412f7e580bb2e479db5133d2504f725
5
+ SHA512:
6
+ metadata.gz: 8cead3d3f26398a34925d6ba326c981f19be8e4324348f7dd8879a1c291ad11bd80080c11023477e3f4ee5bbfcf5bddfc421e85bea05f8e42acfd672e28bea0f
7
+ data.tar.gz: f11b1a7a3c795865375feb3c873e9158009b6508a06150d91b3dff126b074920b2c91e658c6bc121e91098f64c198e47aaff0a7ee1348adb1e39364212eb2db5
data/AUTHORS ADDED
@@ -0,0 +1 @@
1
+ * Arto Bendiken <arto@bendiken.net>
data/CHANGES.md ADDED
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## 0.1.0 - 2025-01-19
9
+
10
+ ## 0.0.0 - 2025-01-11
data/README.md ADDED
@@ -0,0 +1,232 @@
1
+ # NEAR.rb: NEAR for Ruby
2
+
3
+ [![License](https://img.shields.io/badge/license-Public%20Domain-blue.svg)](https://unlicense.org)
4
+ [![Compatibility](https://img.shields.io/badge/ruby-3.0%2B-blue)](https://rubygems.org/gems/near)
5
+ [![Package](https://img.shields.io/gem/v/near)](https://rubygems.org/gems/near)
6
+ [![Documentation](https://img.shields.io/badge/rubydoc-latest-blue)](https://rubydoc.info/gems/near)
7
+
8
+ **NEAR.rb** is a [Ruby] client library for the [NEAR Protocol].
9
+ It wraps the [NEAR command-line interface] (CLI) into a Ruby interface.
10
+
11
+ ## ✨ Features
12
+
13
+ - Wraps the complete CLI features in an idiomatic Ruby interface.
14
+ - Provides comprehensive account management operations.
15
+ - Supports token operations for NEAR and other assets.
16
+ - Supports smart contract deployment and interaction.
17
+ - Handles transaction construction, signing, and monitoring.
18
+ - Integrates with hardware wallets and secure key storage.
19
+ - Implements type-safe balance operations and input validation.
20
+ - Supports both the [mainnet] and [testnet] environments.
21
+ - Offers cross-platform support with zero library dependencies.
22
+ - 100% free and unencumbered public domain software.
23
+
24
+ ## 🛠️ Prerequisites
25
+
26
+ - [NEAR CLI] 0.17+
27
+ - [Ruby] 3.0+
28
+
29
+ ## ⬇️ Installation
30
+
31
+ ### Installation via RubyGems
32
+
33
+ ```bash
34
+ gem install near
35
+ ```
36
+
37
+ ## 👉 Examples
38
+
39
+ ### Importing the library
40
+
41
+ ```ruby
42
+ require 'near'
43
+
44
+ # Use the NEAR testnet (the default):
45
+ testnet = NEAR::CLI.new(network: 'testnet')
46
+
47
+ # Use the NEAR mainnet (to test in prod):
48
+ # mainnet = NEAR::CLI.new(network: 'mainnet')
49
+ ```
50
+
51
+ ### Viewing account details
52
+
53
+ ```ruby
54
+ # View an account summary:
55
+ summary = testnet.view_account_summary('arto.testnet')
56
+ puts summary
57
+
58
+ # View an account at a specific block height:
59
+ summary = testnet.view_account_summary('arto.testnet',
60
+ block: 185_304_186
61
+ )
62
+
63
+ # View an account at a specific block hash:
64
+ summary = testnet.view_account_summary('arto.testnet',
65
+ block: '13UmYhdcdst88aC19QhjYjNMF1zRmaAyY6iqwc5q45bx'
66
+ )
67
+
68
+ # List access keys in an account:
69
+ keys = testnet.list_keys('arto.testnet')
70
+ puts keys
71
+ ```
72
+
73
+ ### Importing accounts
74
+
75
+ ```ruby
76
+ # Import an account using a seed phrase:
77
+ result = testnet.import_account_with_seed_phrase(
78
+ 'rapid cover napkin accuse junk drill sick tooth poem patch evil fan',
79
+ hd_path: "m/44'/397'/0'"
80
+ )
81
+
82
+ # Import an account using a private key:
83
+ result = testnet.import_account_with_private_key(
84
+ 'ed25519:5YhAaEe3G4VtiBavJMvpzPPmknfsTauzVjwK1ZjPVw2MFM6zFyUv4tSiSfCbCn78mEnMifE6iX5qbhFsWEwErcC2'
85
+ )
86
+ ```
87
+
88
+ ### Creating accounts
89
+
90
+ ```ruby
91
+ # Create an account funded from a faucet (testnet only):
92
+ result = testnet.create_account_with_faucet(
93
+ 'mynewaccount.testnet',
94
+ 'ed25519:HVPgAsZkZ7cwLZDqK313XJsDyqAvgBxrATcD7VacA8KE'
95
+ )
96
+
97
+ # Create an account funded by another account:
98
+ result = testnet.create_account_with_funding(
99
+ 'sub.example.testnet', # new account
100
+ 'example.testnet', # funding account
101
+ 'ed25519:6jm8hWUgwoEeGmpdEyk9zrCqtXM8kHhvg8M236ZaGusS', # public key
102
+ '1 NEAR' # initial deposit
103
+ )
104
+
105
+ # Create a new implicit account:
106
+ result = testnet.create_implicit_account('/path/to/credentials/folder')
107
+ ```
108
+
109
+ ### Deleting accounts
110
+
111
+ ```ruby
112
+ # Delete an existing account:
113
+ result = testnet.delete_account(
114
+ 'todelete.testnet', # account to delete
115
+ 'beneficiary.testnet' # account receiving remaining balance
116
+ )
117
+ ```
118
+
119
+ ### Managing access keys
120
+
121
+ ```ruby
122
+ # Add a full-access key to an account:
123
+ result = testnet.add_full_access_key(
124
+ 'myaccount.testnet',
125
+ 'ed25519:75a5ZgVZ9DFTxs4THtFxPtLj7AY3YzpxtapTQBdcMXx3'
126
+ )
127
+
128
+ # Add a function-call key to an account:
129
+ result = testnet.add_function_call_key(
130
+ 'myaccount.testnet',
131
+ 'ed25519:27R66L6yevyHbsk4fESZDC8QUQBwCdx6vvkk1uQmG7NY',
132
+ 'app.example.testnet', # contract that can be called
133
+ ['set_status', 'get_status'], # allowed methods
134
+ '1 NEAR' # allowance
135
+ )
136
+
137
+ # Delete an access key from an account:
138
+ result = testnet.delete_key(
139
+ 'myaccount.testnet',
140
+ 'ed25519:75a5ZgVZ9DFTxs4THtFxPtLj7AY3YzpxtapTQBdcMXx3'
141
+ )
142
+ ```
143
+
144
+ ### Managing tokens
145
+
146
+ ```ruby
147
+ # Send NEAR tokens from one account to another:
148
+ result = testnet.send_near(
149
+ 'mysender.testnet',
150
+ 'myreceiver.testnet',
151
+ NEAR::Balance.new('0.1')
152
+ )
153
+ ```
154
+
155
+ ### Calling read-only contract methods
156
+
157
+ ```ruby
158
+ # Call a view method:
159
+ result = testnet.view_call(
160
+ 'myapp.testnet', # contract account
161
+ 'get_status', # method name
162
+ { account_id: 'user.testnet' } # arguments
163
+ )
164
+
165
+ # Call a view method at a specific block height:
166
+ result = testnet.view_call(
167
+ 'myapp.testnet',
168
+ 'get_status',
169
+ { account_id: 'user.testnet' },
170
+ block: 12345678
171
+ )
172
+ ```
173
+
174
+ ### Calling mutative contract methods
175
+
176
+ ```ruby
177
+ # Call a mutative method as a transaction:
178
+ result = testnet.call_function(
179
+ 'myapp.testnet', # contract account
180
+ 'set_status', # method name
181
+ { status: 'Hello NEAR!' }, # arguments
182
+ signer_id: 'user.testnet', # account that signs tx
183
+ deposit: '1 NEAR', # attached deposit
184
+ gas: '30 TGas' # attached gas
185
+ )
186
+ ```
187
+
188
+ ### Deploying a smart contract
189
+
190
+ ```ruby
191
+ # Deploy a new contract:
192
+ result = testnet.deploy_contract(
193
+ 'myapp.testnet', # contract account
194
+ '/tmp/contract.wasm', # WASM file path
195
+ signer_id: 'deployer.testnet',
196
+ # Optional initialization:
197
+ init_method: 'new',
198
+ init_args: { owner_id: 'deployer.testnet' },
199
+ init_deposit: '0 NEAR',
200
+ init_gas: '30 TGas'
201
+ )
202
+
203
+ # Download a contract WebAssembly blob:
204
+ result = testnet.download_wasm(
205
+ 'myapp.testnet',
206
+ '/tmp/contract.wasm'
207
+ )
208
+ ```
209
+
210
+ ## 📚 Reference
211
+
212
+ https://rubydoc.info/gems/near
213
+
214
+ ## 👨‍💻 Development
215
+
216
+ ```bash
217
+ git clone https://github.com/dryruby/near.rb.git
218
+ ```
219
+
220
+ - - -
221
+
222
+ [![Share on Twitter](https://img.shields.io/badge/share%20on-twitter-03A9F4?logo=twitter)](https://x.com/share?url=https://github.com/dryruby/near.rb&text=NEAR.rb)
223
+ [![Share on Reddit](https://img.shields.io/badge/share%20on-reddit-red?logo=reddit)](https://reddit.com/submit?url=https://github.com/dryruby/near.rb&title=NEAR.rb)
224
+ [![Share on Hacker News](https://img.shields.io/badge/share%20on-hacker%20news-orange?logo=ycombinator)](https://news.ycombinator.com/submitlink?u=https://github.com/dryruby/near.rb&t=NEAR.rb)
225
+ [![Share on Facebook](https://img.shields.io/badge/share%20on-facebook-1976D2?logo=facebook)](https://www.facebook.com/sharer/sharer.php?u=https://github.com/dryruby/near.rb)
226
+
227
+ [NEAR CLI]: https://github.com/near/near-cli-rs
228
+ [NEAR Protocol]: https://near.org
229
+ [NEAR command-line interface]: https://docs.near.org/tools/near-cli
230
+ [Ruby]: https://ruby-lang.org
231
+ [mainnet]: https://docs.near.org/concepts/basics/networks#mainnet
232
+ [testnet]: https://docs.near.org/concepts/basics/networks#testnet
data/UNLICENSE ADDED
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <https://unlicense.org/>
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,31 @@
1
+ # This is free and unencumbered software released into the public domain.
2
+
3
+ ##
4
+ # Represents a NEAR account.
5
+ #
6
+ # @see https://nomicon.io/DataStructures/Account
7
+ class NEAR::Account
8
+ ##
9
+ # @param [String, #to_s] id
10
+ def initialize(id)
11
+ @id = id.to_s
12
+ end
13
+
14
+ ##
15
+ # The account name.
16
+ #
17
+ # @return [String]
18
+ attr_reader :id
19
+
20
+ ##
21
+ # The balance as a Ⓝ-prefixed string.
22
+ #
23
+ # @return [String]
24
+ def inspect
25
+ "Ⓝ#{@id}"
26
+ end
27
+
28
+ ##
29
+ # @return [String]
30
+ def to_s; @id; end
31
+ end # NEAR::Block
@@ -0,0 +1,57 @@
1
+ # This is free and unencumbered software released into the public domain.
2
+
3
+ require 'bigdecimal'
4
+
5
+ ##
6
+ # Represents a NEAR balance.
7
+ class NEAR::Balance
8
+ def self.from_near(s)
9
+ self.new(s)
10
+ end
11
+
12
+ ##
13
+ # @param [Numeric] quantity
14
+ # @raise [ArgumentError] if quantity is not a valid number
15
+ def initialize(quantity)
16
+ @quantity = case quantity
17
+ when BigDecimal then quantity
18
+ when Rational then quantity
19
+ when Integer then quantity
20
+ when Float then quantity
21
+ when String then BigDecimal(quantity)
22
+ else raise ArgumentError, "invalid quantity: #{quantity.inspect}"
23
+ end
24
+ end
25
+
26
+ ##
27
+ # The balance as a Ⓝ-prefixed string.
28
+ #
29
+ # @return [String]
30
+ def inspect
31
+ "Ⓝ#{@quantity.to_f}"
32
+ end
33
+
34
+ ##
35
+ # The balance as a string.
36
+ #
37
+ # @return [String]
38
+ def to_s; @quantity.to_s; end
39
+
40
+ ##
41
+ # The balance as a rational number.
42
+ #
43
+ # @return [Rational]
44
+ def to_r; @quantity.to_r; end
45
+
46
+ ##
47
+ # The balance as an integer.
48
+ #
49
+ # @return [Integer]
50
+ def to_i; @quantity.to_i; end
51
+
52
+ ##
53
+ # The balance as a floating-point number.
54
+ #
55
+ # @return [Float]
56
+ def to_f; @quantity.to_f; end
57
+ end # NEAR::Balance
data/lib/near/block.rb ADDED
@@ -0,0 +1,59 @@
1
+ # This is free and unencumbered software released into the public domain.
2
+
3
+ ##
4
+ # Represents a NEAR block.
5
+ class NEAR::Block
6
+ ##
7
+ # @return [NEAR::Block]
8
+ def self.now
9
+ self.new
10
+ end
11
+
12
+ ##
13
+ # @param [Integer, #to_i] height
14
+ # @return [NEAR::Block]
15
+ def self.at_height(height)
16
+ self.new(height: height)
17
+ end
18
+
19
+ ##
20
+ # @param [String, #to_s] hash
21
+ # @return [NEAR::Block]
22
+ def self.at_hash(hash)
23
+ self.new(hash: hash)
24
+ end
25
+
26
+ ##
27
+ # @param [Integer, #to_i] height
28
+ # @param [String, #to_s] hash
29
+ def initialize(height: nil, hash: nil)
30
+ @height = height.to_i if height
31
+ @hash = hash.to_s if hash
32
+ end
33
+
34
+ ##
35
+ # The height of the block.
36
+ #
37
+ # @return [Integer]
38
+ attr_reader :height
39
+
40
+ ##
41
+ # The hash of the block.
42
+ #
43
+ # @return [String]
44
+ attr_reader :hash
45
+
46
+ ##
47
+ # @return [Array<String>]
48
+ def to_cli_args
49
+ return ['at-block-height', @height] if @height
50
+ return ['at-block-hash', @hash] if @hash
51
+ ['now']
52
+ end
53
+
54
+ ##
55
+ # @return [String]
56
+ def to_s
57
+ (@height || @hash || :now).to_s
58
+ end
59
+ end # NEAR::Block
@@ -0,0 +1,264 @@
1
+ # This is free and unencumbered software released into the public domain.
2
+
3
+ ##
4
+ # @see https://github.com/near/near-cli-rs/blob/main/docs/GUIDE.en.md#account---Manage-accounts
5
+ module NEAR::CLI::Account
6
+ ##
7
+ # Views properties for an account.
8
+ #
9
+ # @param [String] account_id
10
+ # @param [Block, Integer, String, Symbol] block
11
+ # @return [String]
12
+ def view_account_summary(account_id, block: :now)
13
+ stdout, _ = execute(
14
+ 'account',
15
+ 'view-account-summary', account_id,
16
+ 'network-config', @network,
17
+ *block_args(block)
18
+ )
19
+ stdout
20
+ end
21
+
22
+ ##
23
+ # Lists access keys for an account.
24
+ #
25
+ # @param [String] account_id
26
+ # @param [Block, Integer, String, Symbol] block
27
+ # @return [String]
28
+ def list_keys(account_id, block: :now)
29
+ stdout, _ = execute(
30
+ 'account',
31
+ 'list-keys', account_id,
32
+ 'network-config', @network,
33
+ *block_args(block)
34
+ )
35
+ stdout
36
+ end
37
+
38
+ ##
39
+ # Imports an existing account using a seed phrase.
40
+ #
41
+ # @param [String] seed_phrase
42
+ # @param [String] hd_path
43
+ # @return [String]
44
+ def import_account_with_seed_phrase(seed_phrase, hd_path: "m/44'/397'/0'")
45
+ _, stderr = execute(
46
+ 'account',
47
+ 'import-account',
48
+ 'using-seed-phrase', seed_phrase,
49
+ '--seed-phrase-hd-path', hd_path,
50
+ 'network-config', @network
51
+ )
52
+ stderr
53
+ end
54
+
55
+ ##
56
+ # Imports an existing account using a private key.
57
+ #
58
+ # @param [String] private_key
59
+ # @return [String]
60
+ def import_account_with_private_key(private_key)
61
+ _, stderr = execute(
62
+ 'account',
63
+ 'import-account',
64
+ 'using-private-key', private_key,
65
+ 'network-config', @network
66
+ )
67
+ stderr
68
+ end
69
+
70
+ ##
71
+ # Creates a new account sponsored by the faucet service.
72
+ #
73
+ # @param [String] new_account_id
74
+ # @param [String] public_key
75
+ # @return [String]
76
+ def create_account_with_faucet(new_account_id, public_key)
77
+ stdout, stderr = execute(
78
+ 'account',
79
+ 'create-account',
80
+ 'sponsor-by-faucet-service', new_account_id,
81
+ 'use-manually-provided-public-key', public_key,
82
+ 'network-config', @network,
83
+ 'create'
84
+ )
85
+ stderr
86
+ end
87
+
88
+ ##
89
+ # Creates a new account funded by another account.
90
+ #
91
+ # @param [String] new_account_id
92
+ # @param [String] funding_account_id
93
+ # @param [String] public_key
94
+ # @param [String] deposit
95
+ # @return [String]
96
+ def create_account_with_funding(new_account_id, funding_account_id, public_key, deposit)
97
+ stdout, stderr = execute(
98
+ 'account',
99
+ 'create-account',
100
+ 'fund-myself', new_account_id, deposit,
101
+ 'use-manually-provided-public-key', public_key,
102
+ 'sign-as', funding_account_id,
103
+ 'network-config', @network,
104
+ 'sign-with-keychain',
105
+ 'send'
106
+ )
107
+ stderr
108
+ end
109
+
110
+ ##
111
+ # Creates an implicit account.
112
+ #
113
+ # @param [String] save_path
114
+ # @return [String]
115
+ def create_implicit_account(save_path)
116
+ stdout, stderr = execute(
117
+ 'account',
118
+ 'create-account',
119
+ 'fund-later',
120
+ 'use-auto-generation',
121
+ 'save-to-folder', save_path
122
+ )
123
+ stderr
124
+ end
125
+
126
+ ##
127
+ # Deletes an account and transfers remaining balance to beneficiary.
128
+ #
129
+ # @param [String] account_id
130
+ # @param [String] beneficiary_id
131
+ # @return [String]
132
+ def delete_account(account_id, beneficiary_id)
133
+ stdout, stderr = execute(
134
+ 'account',
135
+ 'delete-account', account_id,
136
+ 'beneficiary', beneficiary_id,
137
+ 'network-config', @network,
138
+ 'sign-with-keychain',
139
+ 'send'
140
+ )
141
+ stderr
142
+ end
143
+
144
+ ##
145
+ # Adds a full access key to an account.
146
+ #
147
+ # @param [String] account_id
148
+ # @param [String] public_key
149
+ # @return [String]
150
+ def add_full_access_key(account_id, public_key)
151
+ stdout, stderr = execute(
152
+ 'account',
153
+ 'add-key', account_id,
154
+ 'grant-full-access',
155
+ 'use-manually-provided-public-key', public_key,
156
+ 'network-config', @network,
157
+ 'sign-with-keychain',
158
+ 'send'
159
+ )
160
+ stderr
161
+ end
162
+
163
+ ##
164
+ # Adds a function call access key to an account.
165
+ #
166
+ # @param [String] account_id
167
+ # @param [String] public_key
168
+ # @param [String] receiver_id
169
+ # @param [Array<String>] method_names
170
+ # @param [String] allowance
171
+ # @return [String]
172
+ def add_function_call_key(account_id, public_key, receiver_id, method_names, allowance)
173
+ stdout, stderr = execute(
174
+ 'account',
175
+ 'add-key', account_id,
176
+ 'grant-function-call-access',
177
+ '--allowance', allowance,
178
+ '--receiver-account-id', receiver_id,
179
+ '--method-names', method_names.join(', '),
180
+ 'use-manually-provided-public-key', public_key,
181
+ 'network-config', @network,
182
+ 'sign-with-keychain',
183
+ 'send'
184
+ )
185
+ stderr
186
+ end
187
+
188
+ ##
189
+ # Deletes an access key from an account.
190
+ #
191
+ # @param [String] account_id
192
+ # @param [String] public_key
193
+ # @return [String]
194
+ def delete_key(account_id, public_key)
195
+ stdout, stderr = execute(
196
+ 'account',
197
+ 'delete-key', account_id,
198
+ public_key,
199
+ 'network-config', @network,
200
+ 'sign-with-keychain',
201
+ 'send'
202
+ )
203
+ stderr
204
+ end
205
+
206
+ ##
207
+ # Views storage balance for an account.
208
+ #
209
+ # @param [String] contract_id
210
+ # @param [String] account_id
211
+ # @param [Block, Integer, String, Symbol] block
212
+ # @return [String]
213
+ def view_storage_balance(contract_id, account_id, block: :now)
214
+ stdout, _ = execute(
215
+ 'account',
216
+ 'manage-storage-deposit', contract_id,
217
+ 'view-balance', account_id,
218
+ 'network-config', @network,
219
+ *block_args(block)
220
+ )
221
+ stdout
222
+ end
223
+
224
+ ##
225
+ # Makes a storage deposit for an account.
226
+ #
227
+ # @param [String] contract_id
228
+ # @param [String] account_id
229
+ # @param [String] deposit
230
+ # @param [String] sign_as
231
+ # @return [String]
232
+ def make_storage_deposit(contract_id, account_id, deposit, sign_as)
233
+ stdout, stderr = execute(
234
+ 'account',
235
+ 'manage-storage-deposit', contract_id,
236
+ 'deposit', account_id, deposit,
237
+ 'sign-as', sign_as,
238
+ 'network-config', @network,
239
+ 'sign-with-keychain',
240
+ 'send'
241
+ )
242
+ stderr
243
+ end
244
+
245
+ ##
246
+ # Withdraws storage deposit for an account.
247
+ #
248
+ # @param [String] contract_id
249
+ # @param [String] amount
250
+ # @param [String] account_id
251
+ # @return [String]
252
+ def withdraw_storage_deposit(contract_id, amount, account_id)
253
+ stdout, stderr = execute(
254
+ 'account',
255
+ 'manage-storage-deposit', contract_id,
256
+ 'withdraw', amount,
257
+ 'sign-as', account_id,
258
+ 'network-config', @network,
259
+ 'sign-with-keychain',
260
+ 'send'
261
+ )
262
+ stderr
263
+ end
264
+ end # NEAR::CLI::Account
@@ -0,0 +1,7 @@
1
+ # This is free and unencumbered software released into the public domain.
2
+
3
+ ##
4
+ # @see https://github.com/near/near-cli-rs/blob/main/docs/GUIDE.en.md#config---Manage-connections-in-a-configuration-file
5
+ module NEAR::CLI::Config
6
+ # TODO: implement the `NEAR::CLI::Config` module.
7
+ end # NEAR::CLI::Config