-
Notifications
You must be signed in to change notification settings - Fork 524
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* support DynamicNFT * Update history.md * use xrpl-codec-gen to generate definitions.json and modify ripple-binary-code HISTORY.md * use validateRequiredField for NFTokenID check * move comment to a proper place * Add some comment and modify integration test * update transaction number * update ci rippled version
- Loading branch information
1 parent
abdb192
commit 23d26c8
Showing
11 changed files
with
229 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -188,3 +188,4 @@ fixNFTokenPageLinks | |
fixInnerObjTemplate2 | ||
fixEnforceNFTokenTrustline | ||
fixReducedOffersV2 | ||
DynamicNFT |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
import { ValidationError } from '../../errors' | ||
import { isHex } from '../utils' | ||
|
||
import { | ||
BaseTransaction, | ||
validateBaseTransaction, | ||
isAccount, | ||
isString, | ||
validateOptionalField, | ||
Account, | ||
validateRequiredField, | ||
} from './common' | ||
|
||
/** | ||
* The NFTokenModify transaction modifies an NFToken's URI | ||
* if its tfMutable is set to true. | ||
*/ | ||
export interface NFTokenModify extends BaseTransaction { | ||
TransactionType: 'NFTokenModify' | ||
/** | ||
* Identifies the NFTokenID of the NFToken object that the | ||
* offer references. | ||
*/ | ||
NFTokenID: string | ||
/** | ||
* Indicates the AccountID of the account that owns the corresponding NFToken. | ||
* Can be omitted if the owner is the account submitting this transaction | ||
*/ | ||
Owner?: Account | ||
/** | ||
* URI that points to the data and/or metadata associated with the NFT. | ||
* This field need not be an HTTP or HTTPS URL; it could be an IPFS URI, a | ||
* magnet link, immediate data encoded as an RFC2379 "data" URL, or even an | ||
* opaque issuer-specific encoding. The URI is NOT checked for validity, but | ||
* the field is limited to a maximum length of 256 bytes. | ||
* | ||
* This field must be hex-encoded. You can use `convertStringToHex` to | ||
* convert this field to the proper encoding. | ||
* | ||
* This field must not be an empty string. Omit it from the transaction or | ||
* set to `undefined` value if you do not use it. | ||
*/ | ||
URI?: string | null | ||
} | ||
|
||
/** | ||
* Verify the form and type of an NFTokenModify at runtime. | ||
* | ||
* @param tx - An NFTokenModify Transaction. | ||
* @throws When the NFTokenModify is Malformed. | ||
*/ | ||
export function validateNFTokenModify(tx: Record<string, unknown>): void { | ||
validateBaseTransaction(tx) | ||
|
||
validateRequiredField(tx, 'NFTokenID', isString) | ||
validateOptionalField(tx, 'Owner', isAccount) | ||
validateOptionalField(tx, 'URI', isString) | ||
|
||
if (tx.URI !== undefined && typeof tx.URI === 'string') { | ||
if (tx.URI === '') { | ||
throw new ValidationError('NFTokenModify: URI must not be empty string') | ||
} | ||
if (!isHex(tx.URI)) { | ||
throw new ValidationError('NFTokenModify: URI must be in hex format') | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
104 changes: 104 additions & 0 deletions
104
packages/xrpl/test/integration/transactions/nftokenModify.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
import { assert } from 'chai' | ||
|
||
import { NFTokenModify } from '../../../dist/npm' | ||
import { NFTokenMintFlags } from '../../../dist/npm/src' | ||
import { | ||
convertStringToHex, | ||
getNFTokenID, | ||
NFTokenMint, | ||
TransactionMetadata, | ||
TxRequest, | ||
} from '../../../src' | ||
import { hashSignedTx } from '../../../src/utils/hashes' | ||
import serverUrl from '../serverUrl' | ||
import { | ||
setupClient, | ||
teardownClient, | ||
type XrplIntegrationTestContext, | ||
} from '../setup' | ||
import { testTransaction } from '../utils' | ||
|
||
// how long before each test case times out | ||
const TIMEOUT = 20000 | ||
|
||
describe('NFTokenModify', function () { | ||
let testContext: XrplIntegrationTestContext | ||
|
||
beforeEach(async () => { | ||
testContext = await setupClient(serverUrl) | ||
}) | ||
afterEach(async () => teardownClient(testContext)) | ||
|
||
// Mint an NFToken with tfMutable flag and modify URI later | ||
it( | ||
'modify NFToken URI', | ||
async function () { | ||
const oldUri = convertStringToHex('https://www.google.com') | ||
const newUri = convertStringToHex('https://www.youtube.com') | ||
|
||
const mutableMint: NFTokenMint = { | ||
TransactionType: 'NFTokenMint', | ||
Account: testContext.wallet.address, | ||
Flags: NFTokenMintFlags.tfMutable, | ||
URI: oldUri, | ||
NFTokenTaxon: 0, | ||
} | ||
const response = await testTransaction( | ||
testContext.client, | ||
mutableMint, | ||
testContext.wallet, | ||
) | ||
assert.equal(response.type, 'response') | ||
|
||
const mutableTx: TxRequest = { | ||
command: 'tx', | ||
transaction: hashSignedTx(response.result.tx_blob), | ||
} | ||
const mutableTxResponse = await testContext.client.request(mutableTx) | ||
|
||
const mutableNFTokenID = | ||
getNFTokenID( | ||
mutableTxResponse.result.meta as TransactionMetadata<NFTokenMint>, | ||
) ?? 'undefined' | ||
|
||
const accountNFTs = await testContext.client.request({ | ||
command: 'account_nfts', | ||
account: testContext.wallet.address, | ||
}) | ||
|
||
assert.equal( | ||
accountNFTs.result.account_nfts.find( | ||
(nft) => nft.NFTokenID === mutableNFTokenID, | ||
)?.URI, | ||
oldUri, | ||
) | ||
|
||
const modifyTx: NFTokenModify = { | ||
TransactionType: 'NFTokenModify', | ||
Account: testContext.wallet.address, | ||
NFTokenID: mutableNFTokenID, | ||
URI: newUri, | ||
} | ||
|
||
const modifyResponse = await testTransaction( | ||
testContext.client, | ||
modifyTx, | ||
testContext.wallet, | ||
) | ||
assert.equal(modifyResponse.type, 'response') | ||
|
||
const nfts = await testContext.client.request({ | ||
command: 'account_nfts', | ||
account: testContext.wallet.address, | ||
}) | ||
|
||
assert.equal( | ||
nfts.result.account_nfts.find( | ||
(nft) => nft.NFTokenID === mutableNFTokenID, | ||
)?.URI, | ||
newUri, | ||
) | ||
}, | ||
TIMEOUT, | ||
) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import { assert } from 'chai' | ||
|
||
import { convertStringToHex, validate, ValidationError } from '../../src' | ||
|
||
const TOKEN_ID = | ||
'00090032B5F762798A53D543A014CAF8B297CFF8F2F937E844B17C9E00000003' | ||
|
||
/** | ||
* NFTokenModify Transaction Verification Testing. | ||
* | ||
* Providing runtime verification testing for each specific transaction type. | ||
*/ | ||
describe('NFTokenModify', function () { | ||
it(`verifies valid NFTokenModify`, function () { | ||
const validNFTokenModify = { | ||
TransactionType: 'NFTokenModify', | ||
Account: 'rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm', | ||
NFTokenID: TOKEN_ID, | ||
Fee: '5000000', | ||
Sequence: 2470665, | ||
URI: convertStringToHex('http://xrpl.org'), | ||
} as any | ||
|
||
assert.doesNotThrow(() => validate(validNFTokenModify)) | ||
}) | ||
|
||
it(`throws w/ missing NFTokenID`, function () { | ||
const invalid = { | ||
TransactionType: 'NFTokenModify', | ||
Account: 'rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm', | ||
Fee: '5000000', | ||
Sequence: 2470665, | ||
} as any | ||
|
||
assert.throws( | ||
() => validate(invalid), | ||
ValidationError, | ||
'NFTokenModify: missing field NFTokenID', | ||
) | ||
}) | ||
}) |